关于Task的使用,一直都是半知半解,最近终于有时间详细的看了一遍MSDN,作为备忘录,将心得也记录下来和大家分享。
首先,根据MSDN的描述,Task是FrameWork4引进的新功能,他和ConCurrent命名空间一起被引进,用来替代Thread的使用。
根据我的使用,个人觉得,他确实比Thead的功能要丰富一些。
先一个最简单的例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace TaskConsole { class Program { static void Main(string[] args) { //当前线程标识 Console.WriteLine(Thread.CurrentThread.GetHashCode()); Task task = new Task(run); Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态 task.Start(); Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态 //任务完成后执行新任务 Action<Task> ation = new Action<Task>(taskStart); task.ContinueWith(ation); Console.Read(); } public static void taskStart(Task task) { task = new Task(run); task.Start(); //如果注释上面两句话,则任务标识为 task.ContinueWith(ation)中task的任务 Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status + ",当前线程:" + Thread.CurrentThread.GetHashCode());//状态 } public static void run() { Console.WriteLine("this is run"); } } }
解释几个方法:
一,task.GetHashCode(),是获取Task实例的唯一标识,每个Task都不一样。但是,经过我的测试发现,Task.GetHashCode()并不等于Thread.CurrentThread.GetHashCode()。
二,task.ContinueWith(),是任务结束后继续执行任务的方法,传一个Action,当任务结束后,触发该Action。
运行结果如下,任务刚new出来的时候,task就又状态了,是Created,一但运行了,状态就是WaitingToRun。
根据MSDN的说明,Task.State是获取TaskState的枚举值,其枚举值代表的意义如下(直接复制了MSDN的解释)
成员名称 | 说明 | |
---|---|---|
Canceled | 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关更多信息,请参见任务取消。 | |
Created | 该任务已初始化,但尚未被计划。 | |
Faulted | 由于未处理异常的原因而完成的任务。 | |
RanToCompletion | 已成功完成执行的任务。 | |
Running | 该任务正在运行,但尚未完成。 | |
WaitingForActivation | 该任务正在等待 .NET Framework 基础结构在内部将其激活并进行计划。 | |
WaitingForChildrenToComplete | 该任务已完成执行,正在隐式等待附加的子任务完成。 | |
WaitingToRun | 该任务已被计划执行,但尚未开始执行。 |