宿迁环保局网站建设局,网站设计技术有哪些,开发网站需要注意,推荐聊城做网站一. 背景 揭秘#xff1a; 在前面的章节介绍过#xff0c;Task出现之前#xff0c;微软的多线程处理方式有#xff1a;Thread→ThreadPool→委托的异步调用#xff0c;虽然也可以基本业务需要的多线程场景#xff0c;但它们在多个线程的等待处理方面、资源占用方面、线程…一. 背景 揭秘 在前面的章节介绍过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方式启动。 2. 调用Task类下的静态方法Run进行启动 使用该方式启动更加简洁不需要实例化也不需要调用Start方法Run方法直接通过Action委托的方式进行传参即可即: (){} 。 3. TaskFactory工厂启动 使用TaskFactory工厂的StartNew方法启动其中TaskFactory工厂可以直接实例化或者 Task.Factory (推荐)。 4. 实例化方式RunSynchronously同步启动 Task实例化的方式然后调用同步方法RunSynchronously 进行线程启动。(PS: 类似委托开启线程BeginInvoke是异步而Invoke是同步) 三. Task的线程等待和延续 揭秘 线程等待和延续通常情况放在一起来说在同步方法中即在单线程中业务代码块按照从上往下的顺序执行下面的代码块必须要等上面的代码块执行完毕后才能继续执行这本身就是一种等待和延续只不过是单线程内的等待和延续。 同理来到多线程领域这里的等待就不单单局限于代码块之间的等待和延续了而是上升到某个线程 要等待 另外一个线程执行完毕后方能执行这里特别说明一下前面的章节提到线程等待基本上都是主线程在等子线程当然完全可能是子线程之间的相互等待和延续(实际上这种情况更多)。 Task下的线程等待和延续主要以下几类 ①. Wait针对单个Task的实例可以task1.wait进行线程等待. Task的实例方法 ②. WaitAny执行的线程等待其中任何一个线程执行完毕即可执行(如果主线程执行,则卡主线程) Task的静态方法 ③. WaitAll执行的线程等待其中所有线程执行完毕方可执行(如果主线程执行,则卡主线程) Task的静态方法 ④. WhenAny与下面ContinueWith配合执行,当传入的线程中任何一个线程执行完毕继续执行ContinueWith中的任务(属于开启新线程不卡主线程) Task的静态方法 ⑤. WhenAll与下面ContinueWith配合执行,当传入的线程中所有线程执行完毕继续执行ContinueWith中的任务(属于开启新线程不卡主线程) Task的静态方法 ⑥. ContinueWith和上面WhenAny和WhenAll配合使用 Task的实例方法 1. WaitAny执行的线程等待其中任何一个线程执行完毕即可执行 这里给出线程等待加入集合中的代码下面的线程等待通用这一部分代码将不再列出。 2. WaitAll执行的线程等待其中所有线程执行完毕方可执行 3. WhenAnyContinueWith 当其中一个线程执行完成后新开启了一个线程执行继续执行新业务所以执行过程中不卡主线程。 4. WhenAllContinueWith 当其中所有线程执行完成后新开启了一个线程执行继续执行新业务所以执行过程中不卡主线程。 四. TaskFactory的线程等待 说明 TaskFactory可以开启线程当然也对应的线程的等待和延续。 ①ContinueWhenAny等价于Task的WhenAnyContinueWith ②ContinueWhenAll等价于Task的WhenAllContinueWith 1. ContinueWhenAny 2. ContinueWhenAll