1、简介html
.Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操做。使用任务不只能够得到一个抽象层,还能对底层线程进行不少统一的控制操做。express
主要类:Task(任务),TaskFactory(任务工厂),TaskScheduler(任务调度)数组
2、Task类并发
1.app
Task 类的表示单个操做不返回一个值,一般以异步方式执行。 Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中。 由于由执行工做 Task 对象一般以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可使用Status 属性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 属性,以肯定任务的状态。 大多数状况下,lambda 表达式用于指定的任务是执行的工做。异步
对于返回值的操做,您使用 Task<TResult> 类。async
2.使用Task类的构造函数。实例化Task对象时,任务不会当即运行,而是指定Created状态。接着调用Task类的Start()方法来启动任务。使用Task类时,除了调用Start()方法,还能够调用RunSynchronously()方法。这样,任务也会启动,可是同时调用。默认状况下,任务是异步运行的。函数
Task task = new Task(TaskMethod); task.Start();
ContinueWith即是一个更好的方式,一个任务完成时它能够启动另外一个任务。 post
除了单个等待任务,Task 还提供了两个静态方法:WaitAny和WaitAll,他们容许线程等待一个Task对象数组。ui
WaitAny方法会阻塞调用线程,知道数组中的任何一个Task对象完成,这个方法会返回一个索引值,指明完成的是哪个Task对象。若是发生超时,方法将返回-1。它能够经过一个CancellationToken取消,会抛出一个OperationCanceledException。
WaitAll方法也会阻塞调用线程,知道数组中的全部Task对象都完成,若是所有完成就返回true,若是超时就返回false。固然它也能取消,一样会抛出OperationCanceledException。
获取当前任务的ID
//使用任务对象,获取当前任务ID Console.WriteLine("ID:" + task.Id);
//在任务中,获取当前任务ID Console.WriteLine(Task.CurrentId);
3、TaskFactory类 任务工厂
使用实例化的TaskFactory类,在其中把TaskMethod方法传递给StartNew()方法,就会当即启动任务。
TaskFactory tf = new TaskFactory(); tf.StartNew(TaskMethod);
使用默认Factory对象
Task task = Task.Factory.StartNew(TaskMethod);
4、TaskScheduler类 任务调度
任务基础结构是很灵活的,TaskScheduler对象功不可没。
TaskScheduler对象负责执行调度的任务,同时向Visual Studio调试器公开任务信息,就像一座桥梁,让咱们可以掌控本身的任务线程。
TaskScheduler有两个派生类:thread pool task scheduler(线程池任务调度),和synchronization context task scheduler(同步上下文任务调度器)。默认状况下,因此应用程序使用的都是线程池任务调度器,这个任务调度器将任务调度给线程池的工做者线程。能够查询TaskScheduler的静态Default属性来得到对默认任务调度器的一个引用。
同步上下文任务调度器一般用于桌面应用程序,Winfrom,WPF及Silverlight。这个任务调度器将多有任务都调度给应用程序的GUI线程,使全部任务代码都能成功更新UI组建,好比按钮、菜单项等。同步上下文任务调度器根本不使用线程池。一样,能够查询TaskScheduler的静态FromCurrentSynchronizationContext方法来得到对一个同步上下文任务调度器的引用。
获取当前调取器及id
//获取当前任务调度器,调度器的ID在多个任务中老是为1 TaskScheduler scheduler = TaskScheduler.Current; if (scheduler != null) Console.WriteLine("scheduler:" + scheduler.Id);
获取最大调度级别
TaskScheduler scheduler = TaskScheduler.Current; //获取最大的并发级别,2147483647 Console.WriteLine(scheduler.MaximumConcurrencyLevel); //若是想获取当前全部的任务集合或id,须要本身扩展处理
就像这样建立类型:
1 //同步上下文任务调度 2 TaskScheduler m_syncContextTaskScheduler = 3 TaskScheduler.FromCurrentSynchronizationContext();
任务调度有不少的
更多:
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx