Task是微软在.Net 4.0
时代推出来的,也是微软极力推荐的一种多线程的处理方式,Task
看起来像一个Thread
,实际上,它是在ThreadPool
的基础上进行的封装,Task
的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread
和ThreadPool
。
类 Task 表示不返回值且通常异步执行的单个操作。 Task对象是.NET Framework 4 中首次引入的基于任务的异步模式的核心组件之一。 由于对象执行 Task 的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行,因此可以使用 Status 属性以及 IsCanceled、 IsCompleted和 IsFaulted 属性来确定任务的状态。 大多数情况下,lambda 表达式用于指定任务要执行的工作。
TaskStatus表示 Task 的生命周期中的当前阶段。
Canceled | 6 | 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关详细信息,请参阅任务取消。 |
Created | 0 | 该任务已初始化,但尚未被计划。 |
Faulted | 7 | 由于未处理异常的原因而完成的任务。 |
RanToCompletion | 5 | 已成功完成执行的任务。 |
Running | 3 | 该任务正在运行,但尚未完成。 |
WaitingForActivation | 1 | 该任务正在等待 .NET 基础结构在内部将其激活并进行计划。 |
WaitingForChildrenToComplete | 4 | 该任务已完成执行,正在隐式等待附加的子任务完成。 |
WaitingToRun | 2 | 该任务已被计划执行,但尚未开始执行。 |
一个例子
C#private void btnRun_Click(object sender, EventArgs e)
{
Task t = new Task(() =>
{
this.Invoke(new Action(() =>
{
txtStatus.AppendText("任务开始..."+System.Environment.NewLine);
}));
Thread.Sleep(1000);
});
t.Start();
t.ContinueWith(t =>
{
this.Invoke(new Action(() =>
{
txtStatus.AppendText("IsCanceled="+ t.IsCanceled + ",IsCompleted="+ t.IsCompleted + ",IsFaulted="+ t.IsFaulted);
txtStatus.AppendText("任务完成..." + System.Environment.NewLine);
}));
});
txtStatus.AppendText("Run 完成..." + System.Environment.NewLine);
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!