线程是建立并发的底层工具,所以具备必定的局限性。html
任务是可组合的——使用延续将它们串联在一块儿。它们可使用线程池减小启动延迟,并且它们能够经过TaskCompletionSource
使用回调方法,避免多个线程同时等待I/O密集操做。架构
一、任务是架构在线程之上的,也就是说任务最终仍是要抛给线程去执行。并发
二、任务跟线程不是一对一的关系,好比开10个任务并非说会开10个线程,这一点任务有点相似线程池,可是任务相比线程池有很小的开销和精确的控制。异步
Task和Thread同样,位于System.Threading命名空间下函数
与线程相比,Task
是一个更高级的抽象概念,它标识一个经过或不经过线程实现的并发操做。工具
Task 类的表示单个操做不返回一个值,一般以异步方式执行。 Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中。 由于由执行工做 Task 对象一般以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可使用 Status 属性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 属性,以肯定任务的状态。 大多数状况下,lambda 表达式用于指定的任务是执行的工做。spa
经过使用Task的构造函数来建立任务,并调用Start方法来启动任务并执行异步操做。线程
static void Main(string[] args) { Console.WriteLine("主线程执行业务处理."); //建立任务 Task task = new Task(() => { Console.WriteLine("使用System.Threading.Tasks.Task执行异步操做."); for (int i = 0; i < 10; i++) { Console.WriteLine(i); } }); //启动任务,并安排到当前任务队列线程中执行任务 task.Start(); Console.WriteLine("主线程执行其余处理"); }
从Framework 4.5开始,启动一个由后台线程实现的Task,也可使用静态方法 Task.Run代理
Task task = Task.Run(() => { Thread.Sleep(2000); Console.WriteLine("Foo"); });
调用Wait
方法,能够阻塞任务,直至任务完成,效果等同于Thread.Join
:code
Task task = Task.Run(() => { Thread.Sleep(2000); Console.WriteLine("Foo"); }); Console.WriteLine(task.IsCompleted); //False task.Wait();//阻塞,直至任务完成 Console.WriteLine(task.IsCompleted); //True Console.ReadLine();
Task<TResult>
容许任务返回一个值。调用Task.Run
,传入一个Func<TResult>
代理(或者兼容的Lambda表达式),代替Action,就能够得到一个Task<TResult>:
Task<int> task = Task.Run (() => { Console.WriteLine ("Foo"); return 3; }); int result = task.Result; // Blocks if not already finished Console.WriteLine (result); // 3
下面的例子建立一个任务,它使用LINQ就按前3百万个整数(从2开始)中的素数个数:
Task<int> primeNumberTask = Task.Run(() => Enumerable.Range(2, 3000000).Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0))); Console.WriteLine("Task running..."); Console.WriteLine("The answer is " + primeNumberTask.Result);
这段代码会打印“Task running...”,而后几秒钟后打印216815。
Task.Delay
是Thread.Sleep
的异步版本
Task.Delay(5000).GetAwaiter().OnCompleted(()=>Console.WriteLine(42));
或者
Task.Delay(5000).ContinueWith(ant => Console.WriteLine(42));
参考资料:
https://www.jianshu.com/p/4444f2d77f3b
https://www.cnblogs.com/pengstone/archive/2012/12/23/2830238.html