Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池
ThreadPool.QueueUserWorkItem(A);
这段代码用Task来实现的话,方式如下:
Task.Create(A);
这两端代码的使用和实现的功能都十分相似。但和TheadPool相比,Task有着更多的功能,更加方便我们使用。
- Task.WaitAll()
该函数的功能是等待多个任务等待任务完成,这在线程同步时经常需要用到。
假如我们要创建三个任务,并等待它们完成。这个功能用TheadPool实现如下:
using (ManualResetEvent mre1 = new
ManualResetEvent(false))
using (ManualResetEvent mre2 = new
ManualResetEvent(false))
using (ManualResetEvent mre3 = new
ManualResetEvent(false))
{
ThreadPool.QueueUserWorkItem(delegate
{
A();
mre1.Set();
});
ThreadPool.QueueUserWorkItem(delegate
{
B();
mre2.Set();
});
ThreadPool.QueueUserWorkItem(delegate
{
C();
mre3.Set();
});
WaitHandle.WaitAll(new
WaitHandle[] { mre1, mre2, mre3 });
}
用Task类实现起来就相对简单多了:
Task t1 = Task.Create(delegate { A(); });
Task t2 = Task.Create(delegate { B(); });
Task t3 = Task.Create(delegate { C(); });
t1.Wait();
t2.Wait();
t3.Wait();
或者我们还可以这么写:
Task t1 = Task.Create(delegate { A(); });
Task t2 = Task.Create(delegate { B(); });
Task t3 = Task.Create(delegate { C(); });
Task.WaitAll(t1, t2, t3);
- Task.Cancel和Task.CancelAndWait
这个是一个成员函数,用于取消已经创建的Task,如果该Task正在执行中,该函数并不终止Task的执行,只是将IsCanceled属性设置为true。
Task.Cancel和Task.CancelAndWait的区别在于:Task.CancelAndWait除了取消Task外,还将等待该Task执行完成(如果该Task在执行中)。 - Task.ContinueWith
该成员函数的作用是在执行完Task后,再执行一个后续操作。这也是一个比较有用的功能,由于比较简单,就不介绍了。
除了上述介绍的几个方法外,Task还有一些比较有用的属性和方法,也非常简单,直接参看其说明文档即可。
本文主要介绍了Task的基本的用法,下篇文章将介绍一些进阶的知识。