Parallel类()的并行任务需要结束后才能运行后面的代码,如果想不等结束后在开始动作,可以使用Task类更好地控制并行动作。
任务表示应完成的某个工作单元。这个工作单元可以在单独的线程中运行,也可以以同步方式启动一个任务,这需要等待主调线程。使用任务不仅可以获得一个抽象层,还可以对底层线程进行很多控制。
任务相对Parallel类提供了非常大的灵活性。例如,可以定义连续的工作——在一个任务完成后该执行什么工作。这可以根据任务成功与否来分。还可以在层次结构中安排任务。例如,父任务可以创建新的子任务。
一.启动任务
要启动任务,可以使用TaskFactory类或Task类的构造函数和Start()方法。Task类的构造函数在创建任务上灵活性比较大。
在启动任务时,会创建Task类的一个实例,利用Action或Action<T>委托(不带参数或带一个参数),可以指定应运行的代码。
1.使用线程池的任务
线程池提供了一个后台线程的池(后面详细介绍了线程池)。线程池独自管理线程,根据需要增加或减少线程池中的线程数。线程池中的线程用于实现一些动作,之后仍然返回线程池中。
下面介绍创建线程池的任务的四种方法:
先定义一个要调用使用的方法:
//避免写入控制台的操作交叉,这里使用lock关键字同步 static object taskMethodLock = new object(); static void TaskMethod(object title) { lock (taskMethodLock) { Console.WriteLine(title); Console.WriteLine("task id:{0},thread:{1}",Task.CurrentId,Thread.CurrentThread.ManagedThreadId); Console.WriteLine("is pooled thread:{0}",Thread.CurrentThread.IsThreadPoolThread); Console.WriteLine("is background thread:{0}",Thread.CurrentThread.IsBackground); } }