一、简介
.Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操作。使用任务不仅可以获得一个抽象层,还能对底层线程进行很多统一的控制操作。
主要类:Task(任务),TaskFactory(任务工厂),TaskScheduler(任务调度)
二、Task类
1.
Task 类的表示单个操作不返回一个值,通常以异步方式执行。 Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中。 因为由执行工作 Task 对象通常以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可以使用Status 属性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 属性,以确定任务的状态。 大多数情况下,lambda 表达式用于指定的任务是执行的工作。
对于返回值的操作,您使用 Task<TResult> 类。
2.使用Task类的构造函数。实例化Task对象时,任务不会立即运行,而是指定Created状态。接着调用Task类的Start()方法来启动任务。使用Task类时,除了调用Start()方法,还可以调用RunSynchronously()方法。这样,任务也会启动,但是同时调用。默认情况下,任务是异步运行的。
Task task = new Task(TaskMethod);
task.Start();
ContinueWith便是一个更好的方式,一个任务完成时它可以启动另一个任务。
除了单个等待任务,Task 还提供了两个静态方法:WaitAny和WaitAll,他们允许线程等待一个Task对象数组。
WaitAny方法会阻塞调用线程,知道数组中的任何一个Task对象完成,这个方法会返回一个索引值,指明完成的是哪一个Task对象。如果发生超时,方法将返回-1。它可以通过一个CancellationToken取消,会抛出一个OperationCanceledException。
WaitAll方法也会阻塞调用线程,知道数组中的所有Task对象都完成,如果全部完成就返回true,如果超时就返回false。当然它也能取消,同样会抛出OperationCanceledException。
获取当前任务的ID
//使用任务对象,获取当前任务ID
Console.WriteLine("ID:" + task.Id);
//在任务中,获取当前任务ID
Console.WriteLine(Task.CurrentId);
三、TaskFactory类 任务工厂
使用实例化的TaskFactory类,在其中把TaskMethod方法传递给StartNew()方法,就会立即启动任务。
TaskFactory tf = new TaskFactory();
tf.StartNew(TaskMethod);
使用默认Factory对象
Task task = Task.Factory.StartNew(TaskMethod);
四、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,需要自己扩展处理
就像这样创建类型:
//同步上下文任务调度
TaskScheduler m_syncContextTaskScheduler =
TaskScheduler.FromCurrentSynchronizationContext();
任务调度有很多的
更多:
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx