while (true)
{
//ct.ThrowIfCancellationRequested();
if (result == 5)
{
throw new Exception("error");
}
result++;
Thread.Sleep(1000);
} |
模拟异常后的输出为:
任务完成,完成时候的状态为:
IsCanceled=False IsCompleted=True IsFaulted=True |
Task还支持任务工厂的概念。任务工厂支持多个任务之间共享相同的状态,如取消类型CancellationTokenSource就是可以被共享的。通过使用任务工厂,可以同时取消一组任务:
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
//等待按任意键取消任务
TaskFactory taskFactory = new TaskFactory();
Task[] tasks = new Task[]
{
taskFactory.StartNew(() => Add(cts.Token)),
taskFactory.StartNew(() => Add(cts.Token)),
taskFactory.StartNew(() => Add(cts.Token))
};
//CancellationToken.None指示TasksEnded不能被取消
taskFactory.ContinueWhenAll(tasks, TasksEnded, CancellationToken.None);
Console.ReadKey();
cts.Cancel();
Console.ReadKey();
}
static void TasksEnded(Task[] tasks)
{
Console.WriteLine("所有任务已完成!");
} |
以上代码的输出为:
任务开始……
任务开始……
任务开始……
所有任务已完成(取消)! |
本建议演示了Task(任务)和TaskFactory(任务工厂)的使用方法。Task进一步优化了后台线程池的调度,加快了线程的处理速度。所以在FCL 4.0时代,如果要使用多线程,我们理应更多地使用Task。
因此,在本书接下来的建议中,如无特别必要,只要涉及多线程内容的,都将一并使用Task来完成。
相关链接:
连载1 连载2 连载3 连载4 连载5 连载6 连载7 连载8 连载9
连载10 连载11 连载12 连载13 连载14 连载15 连载71 连载72 连载73
连载74 连载75 连载76 连载77 连载78 连载79