当前位置:   article > 正文

线程中task取消_第四节:Task启动以及Task、TaskFactory线程等待和延续解决方案

task线程启动和停止

一. 背景

揭秘:

在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面、资源占用方面、线程延续和阻塞方面、线程的取消方面等都显得比较笨拙,在面对复杂的业务场景下,显得有点捉襟见肘了。

正是在这种背景下,Task应运而生。

Task是微软在.Net 4.0时代推出来的,也是微软极力推荐的一种多线程的处理方式,Task看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。

二. Task的4种启动方式

概要:

Task的启动有4种方式,其中3种异步启动开启一个新线程,1种同步启动的方式(有点和委托类似,BeginInvoke异步启动,Invoke同步启动),分别是:实例化的方式+Start方法启动、Task下Run方法启动、TaskFactory工厂的StartNew方法启动、Task下的同步方法RunSynchronously 启动。

1. 实例化的方式启动,调用Start方法

Task的构造函数中的参数是Action委托(注:不是Action<>多个重载),所以直接使用 ()=>{ }的方式传参,简洁明了,然后调用Start方式启动。

148a89e2ec53febd4be6408dda12b9cb.png

2. 调用Task类下的静态方法Run,进行启动

使用该方式启动,更加简洁,不需要实例化,也不需要调用Start方法,Run方法直接通过Action委托的方式进行传参即可(即: ()=>{} )。

eb6271baacce463b08449989a3650d18.png

3. TaskFactory工厂启动

使用TaskFactory工厂的StartNew方法启动,其中TaskFactory工厂可以直接实例化,或者 Task.Factory (推荐)。

0ec6daefbaac6cbe4292ad312dfd7ca9.png

4. 实例化方式RunSynchronously同步启动

 Task实例化的方式,然后调用同步方法RunSynchronously ,进行线程启动。(PS: 类似委托开启线程,BeginInvoke是异步,而Invoke是同步)

3c6ecfe8105e89be57da4dd0349bb09f.png

三. Task的线程等待和延续

揭秘:

线程等待和延续通常情况放在一起来说,在同步方法中,即在单线程中,业务代码块按照从上往下的顺序执行,下面的代码块必须要等上面的代码块执行完毕后才能继续执行,这本身就是一种等待和延续,只不过是单线程内的等待和延续。

同理,来到多线程领域,这里的等待就不单单局限于代码块之间的等待和延续了,而是上升到某个线程 要等待 另外一个线程执行完毕后方能执行,这里特别说明一下,前面的章节提到线程等待基本上都是主线程在等子线程,当然,完全可能是子线程之间的相互等待和延续(实际上,这种情况更多)。

Task下的线程等待和延续主要以下几类:

①. Wait:针对单个Task的实例,可以task1.wait进行线程等待.

②. WaitAny:执行的线程等待其中任何一个线程执行完毕即可执行(如果主线程执行,则卡主线程)

③. WaitAll:执行的线程等待其中所有线程执行完毕方可执行(如果主线程执行,则卡主线程)

④. WhenAny:与下面ContinueWith配合执行,当传入的线程中任何一个线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)

⑤. WhenAll:与下面ContinueWith配合执行,当传入的线程中所有线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)

⑥. ContinueWith:和上面WhenAny和WhenAll配合使用

1. WaitAny(执行的线程等待其中任何一个线程执行完毕即可执行)

这里给出线程等待加入集合中的代码,下面的线程等待通用这一部分代码,将不再列出。

2e94f72c34fe7ae57e1908dbdd7d477b.png
189562155864eb930e9b06c7d1680ebd.png
0ca560df538d88e48c79639b569a4a4e.png

2. WaitAll(执行的线程等待其中所有线程执行完毕方可执行)

dcd87c3976ec41ba8c4c9a733421a8e1.png
e3194d5c122e697f904bd298963f1e7e.png

3. WhenAny+ContinueWith

当其中一个线程执行完成后,新开启了一个线程执行,继续执行新业务,所以执行过程中,不卡主线程。

8f6dfa005f02d177e7e937e3c2dba134.png
a9b6d48eae55a7eef435e56911a24e35.png

4. WhenAll+ContinueWith

当其中所有线程执行完成后,新开启了一个线程执行,继续执行新业务,所以执行过程中,不卡主线程。

a1d8a1ad05c4f7683d67ab0675563a60.png

四. TaskFactory的线程等待

说明: TaskFactory可以开启线程,当然也对应的线程的等待和延续。

①:ContinueWhenAny:等价于Task的WhenAny+ContinueWith

②:ContinueWhenAll:等价于Task的WhenAll+ContinueWith

1. ContinueWhenAny

bbb95cd7d4abbc60cddef78a859394f4.png

2. ContinueWhenAll

a9613cd1b6c6f343eb1237698a425fd8.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/104602
推荐阅读
相关标签
  

闽ICP备14008679号