Task类的学习

一、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属性,那么该异常是已观察的异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
医学图像分对比学习是一种利用成对的图像和文本进行训练的方法,旨在学习医学图像的视觉表征。这种方法可以通过比较两个图像或图像与文本之间的相似性来进行分。对比学习可以帮助模型学习到更具判别性的特征,从而提高医学图像分的准确性和性能。深度学习在医学图像分方面取得了很大的进展,特别是在器官分割、病灶检测和分任务中。基于深度学习的医学图像分方法相较于传统的方法具有更好的效果和潜力,因此越来越多的研究人员开始关注和研究这一方法。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [关于对比学习在医学图像理解中两篇Paper的思考](https://blog.csdn.net/qq_45645521/article/details/122442164)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [医学图像分_【阅读笔记】深度学习在医学图像分析领域的综述](https://blog.csdn.net/weixin_39898380/article/details/111585834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C#气氛组队员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值