Net Framework4.0引入了一个新的关于异步操作的API,它叫做.任务并行库( Task Parallel Library,简称TPL), .Net Framework 4.5版对该API进行了轻微的改进,使用更简单。TPL可被认为是线程池之上的又一个抽象层,其对程序员隐藏了与线程池交互的底层代码,并提供了更方便的细粒度的APL, TPL的核心概念是任务。一个任务代表了一个异步操作,该操作可以通过多种方式运行,可以使用或不使用独立线程运行。
一个任务可以通过多种方式和其他任务组合起来。例如,可以同时启动多个任务,等待所有任务完成,然后运行一个任务对之前所有任务的结果进行一些计算。TPL与之前的模式相比,其中一个关键优势是其具有用于组合任务的便利的API,
处理任务中的异常结果有多种方式。由于一个任务可能会由多个其他任务组成,这些任,务也可能依次拥有各自的子任务,所以有一个AggregateException的概念。这种异常可以捕获底层任务内部的所有异常,并允许单独处理这些异常。
而且,最后但并不是最不重要的, C# 5.0已经内置了对TPL的支持,允许我们使用新的 await和async关键字以平滑的、舒服的方式操作任务。
创建任务
namespace ConsoleAppTest { internal class Program { static void Main(string[] args) { var t1=new Task(()=> TaskMethod("Task 1"));//仅当调用Start()方法时才会执行 var t2 = new Task(() => TaskMethod("Task 2")); t2.Start(); t1.Start(); Task.Run(() => TaskMethod("Task 3"));//立即执行,是StartNew 的快捷方式 Task.Factory.StartNew(() => TaskMethod("Task 4"));//立即执行 //标记任务长时间运行,结果任务将不会使用线程池,而在单独的线程中运行, //然而,根据运行该任务的当前的任务调度程序( task scheduler)运行方式有可能不同。 Task.Factory.StartNew(()=>TaskMethod("Task 5"),TaskCreationOptions.LongRunning); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.ReadKey(); } static void TaskMethod(string name) { Console.WriteLine("任务: {0} 线程ID: {1}. 是否在线程池中: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); } } }
注意:每次运行,任务的执行顺序可能不一样,Task 5 标记任务长时间运行,结果任务将不会使用线程池,而在单独的线程中运行,
标签:Task,TPL,任务,线程,TaskMethod,多线程,运行 From: https://www.cnblogs.com/friend/p/17225356.html