Task类的学习

news/2024/7/7 20:06:11

一、Task启动
1、Task类在System.Threading.Tasks命名空间下面
2、开始一个Task最简单的方法是Task.Run(.net 4.5,4.0的时候是Task.Factory.StartNew).
3、使用方法是传入一个委托即可。
4、Task默认使用线程池,也就是后台线程。当主线程结束时,创建的所有task都会结束。
5、Task.Run返回一个Task对象,可以用它来监视其过程。在Task.Run之后,不需要调用Start,因为该方法创建的是热任务,会直接运行。可以通过Task的构造函数创建冷任务,一般很少这么做。
6、可以通过Task的Status属性来跟踪task的执行状态。

二、Wait
1、调用task的Wait方法,会进行主线程阻塞,直至task执行完成。相当于thread的Join方法。
2、Wait防范可以指定一个超时时间,和一个取消令牌来提前结束等待。

三、LongRunning
1、默认情况下,CLR在线程池中运行Task,非常适合短时间运行的Compute-Bound类工作。
2、针对长时间运行的任务或阻塞操作,可以不适用线程池(使用longRuning)。
3、如果运行多个long-running tasks(尤其是其中有处于阻塞状态的),会严重影响性能,这时有比TaskCreationOptions.LongRunning更好的方法:
a、如果任务是IO-Bound,TaskCompletionSource和异步函数可以使用回调(Coninuations)代替线程来实现并发。
b、如果任务是Compute-Bound,生产者/消费者队列允许对任务的并发性进行限流,避免其他线程或进程饿死。

四、Task的返回值
1、Task有一个范型子类Task,它允许返回一个返回值。
2、使用Func委托或兼容的Lambda表达式来调用Task.Run可以得到Task。
例1:

Task<int> task = Task.Run(()=>
{
	return 3;
});
int result = task.Result;

例2:

Task<int> primeNumberTask = Task.Run(()=>
{
	Enumerable.Range(2,3000000).Count(n=>Enumerable.Range(2,(int)Math.Sqrt(n)-1).All(i => n % i > 0)));
});
int result = primeNumberTask.Result;

3、可以通过Result属性来获得返回的结果。如果task没有完成,访问Result属性会阻塞线程直到该task完成.
4、Task可以看作“许诺/未来”(promise/future),它里面包裹着一个Result,稍后可用。
5、在CTP版本的时候,Task实际叫做Future.

Task的异常
1、与Thread不一样,Task可以很方便的传播异常。如果task里抛出了一个未处理的异常,那么这个异常会抛给:
a、调用了Wait的地方
b、访问了Task的Result属性的地方。
例:

Task task = Task.Run(()=>{thorw null;});
try
{
	task.Wait();
}
catch(AggregateException aex)
{
	if(aex.InnerExcepption is nullReferenceException)
	{
		Console.WriteLine("Null");
	}
	else
	{
		throw;
	}
}

2、CLR将异常包裹在AggregateException里,以便在并行编程场景中发挥很好的作用。
3、可以不重新抛出异常,通过Task的IsFaulted和IsCanceled属性也可以检测出Task是否发生了故障。
a、如果两个熟悉都返回false,则没有错误发生。
b、如果IsCanceled为true,说明一个OperationCanceledException为该Task抛出了。
c、如果IsFaulted为true,说明另一个类型的异常被抛出了,二Exception属性也将指明错误。
4、自治的Task是指不通过调用Wait方法,Result属性或Continuation进行会合的任务。针对自治Task,需要显示的处理异常,避免出面未处观察到的异常。可以通过全局的TaskScheduler.UnobservedTaskException来订阅未观察到的异常。
5、未观察到的异常有细微差别:
a、使用超时进行等待的Task,如果超时后发生故障,那么它将产生未观察到的异常。
b、在Task发生异常后,如果访问Task的Exception属性,那么该异常是已观察的异常。


http://lihuaxi.xjx100.cn/news/1172441.html

相关文章

「实在RPA·金融数字员工」为风险防范摁下快捷键实在智能RPA实在智能RPA​

2023年度政府工作报告提出&#xff0c;要大力发展数字经济&#xff0c;提升常态化监管水平&#xff0c;支持平台经济发展&#xff0c;完善金融体制改革&#xff0c;加强金融风险防范。在国家政策的有力支持下&#xff0c;金融行业的数字化转型正如火如荼进行中。 一、金融业数…

CentOS系统如何开展爬虫工作

CentOS 系统可以用于进行爬虫工作。实际上&#xff0c;很多大型网站和在线服务都运行在 Linux 系统下&#xff0c;包括 CentOS、Ubuntu、Debian 等&#xff0c;因此 CentOS 系统也常用于进行爬虫工作。 在CentOS系统上开展爬虫工作&#xff0c;可以按照以下步骤进行&#xff1a…

基于LLMs的多模态大模型(Flamingo, BLIP-2,KOSMOS-1,ScienceQA)

前一篇博客已经整理了不训练视觉模型的文章们&#xff1a; 基于LLMs的多模态大模型&#xff08;Visual ChatGPT&#xff0c;PICa&#xff0c;MM-REACT&#xff0c;MAGIC&#xff09; 本篇文章将介绍一些需要训练视觉编码器来适配多模态大模型的工作们&#xff0c;这也是目前最…

Unity中的InitializeOnLoadMethod

Unity中的InitializeOnLoadMethod特性&#xff1a;深入解析与实践 在Unity开发过程中&#xff0c;我们经常需要在编辑器启动时执行一些操作&#xff0c;例如初始化数据、注册事件等。这时&#xff0c;我们可以使用InitializeOnLoadMethod特性来实现这一需求。本文将详细介绍In…

YOLOv5、YOLOv7改进最新论文CFNet:即插即用|原创改进结构显著提升检测性能,小目标检测涨点必备(一)

💡本篇内容:YOLOv5|YOLOv7改进最新论文CFNet:即插即用|首发改进显著提升检测性能,小目标检测涨点必备 重点:🔥🔥🔥YOLOv5|YOLOv7|YOLOv8 使用这个 核心创新点 在数据集改进做实验:即插即用: 当 CFNet 遇到 YOLO 系列 💡🚀🚀🚀本博客 YOLO系列 + 改…

Spring支持哪些Aware接口?

Spring支持哪些Aware接口? Spring支持哪些Aware接口?Aware接口的优点ApplicationContextAware和BeanFactoryAware的区别 Spring支持哪些Aware接口? ApplicationContextAware:获取ApplicationContext对象BeanFactoryAware:获取BeanFactory对象BeanNameAware:获取Bean的名称E…

Linux系统提权

滥用的SUDO提权 执行流程&#xff1a;当前用户转换到root&#xff0c;然后以root身份执行命令&#xff0c;执行完成后&#xff0c;直接退回到当前用户 注意&#xff1a;执行sudo时输入的命令&#xff0c;是当前用户的密码&#xff0c;而非root密码 sudo配置文件&#xff1a;…

淘宝图片搜索接口API封装

本篇博文介绍了对淘宝图片搜索API的二次封装&#xff0c;将URL参数封装成Python函数&#xff0c;直接传入参数即可获取搜索结果&#xff0c;例如淘宝商品标题、价格、销量和URL等。提供了详细的代码示例和接口调用Demo。 taobao.item_search_img-按图搜索淘宝商品&#xff08;拍…