利用线程,可以方便地进行异步操作。但是线程模型有一个缺点,就是无法处理返回值。要在不同线程之间传递数据比较麻烦。任务则解决了这个问题。
完整代码在这里:https://github.com/techstay/csharp-learning-note 。
创建并执行任务
有返回值和没有返回值的任务
要创建一个没有返回值的任务,只需要向Task类的构造函数传递一个参数列表和返回值都为空的委托(也就是Action委托)即可。构造好一个Task之后,就可以调用Start方法开始执行任务,就像Thread上调用Start一样。这样任务就会开始异步地执行了。
要等待任务完成,可以调用Wait方法,这样就会在该线程上阻塞直到Task完成。另外WaitAny和WaitAll方法接受一个Task数组,WaitAny方法会阻塞调用线程直到有一个Task任务完成,而WaitAll方法会阻塞调用线程直到所有任务完成。
另外,还可以像Task的构造函数传递一个TaskCreationOptions枚举来控制Task的构造和执行。详情可以查看MSDN文档。
Task task1 = new Task(() => Console.WriteLine("创建一个新任务..."));
task1.Start();
task1.Wait();
Task.Run(() => Console.WriteLine("直接运行一个新任务..."))
.Wait();
要创建带有返回值的任务,需要创建一个泛型Task,并向其传入一个Function< TResult>委托。然后便可以执行任务,任务执行完成之后可以调用其Result属性查询任务执行的结果。如果此时任务还没有完成,调用Result的线程会阻塞直到任务完成。如果有异常发生,也会在这个时候抛出。
另外,由于创建一个任务并开始运行是非常常见的代码,所以Task类提供了一个Run方法,接受一个委托并立即创建并执行任务。
Task<int> intValue = Task.Run(() =>
{
Console.WriteLine("创建一个任务并等待结果..");
return 0;
});