C# Task详解 https://www.cnblogs.com/zhaoshujie/p/11082753.html
1、Task的优势
ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
◆ ThreadPool不支持线程执行的先后次序;
以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。
以下是一个简单的任务示例:
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Task t = new Task(() => { Console.WriteLine("任务开始工作……"); //模拟工作过程 Thread.Sleep(5000); }); t.Start(); t.ContinueWith((task) => { Console.WriteLine("任务完成,完成时候的状态为:"); Console.WriteLine("IsCanceled={0} IsCompleted={1} IsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted); }); Console.ReadKey(); } } }
2、Task的用法
2.1、创建任务
(一)无返回值的方式
方式1:
var t1 = new Task(() => TaskMethod("Task 1")); t1.Start(); Task.WaitAll(t1);//等待所有任务结束 注:任务的状态: Start之前为:Created Start之后为:WaitingToRun
方式2:
Task.Run(() => TaskMethod("Task 2"));
方式3:
Task.Factory.StartNew(() => TaskMethod("Task 3")); 直接异步的方法 //或者 var t3=Task.Factory.StartNew(() => TaskMethod("Task 3")); Task.WaitAll(t3);//等待所有任务结束 //任务的状态: Start之前为:Running Start之后为:Running
View Code
async/await的实现方式:
View Code
(二)带返回值的方式
方式4:
Task<int> task = CreateTask("Task 1"); task.Start(); int result = task.Result;
View Code
async/await的实现:
View Code
2.2、组合任务.ContinueWith
简单Demo:
View Code
任务的串行:
View Code
子任务:
View Code
动态并行(TaskCreationOptions.AttachedToParent) 父任务等待所有子任务完成后 整个任务才算完成
View Code
2.3、取消任务 CancellationTokenSource
View Code
2.4、处理任务中的异常
单个任务:
View Code
多个任务:
View Code
async/await的方式:
View Code
2.5、Task.FromResult的应用
View Code
2.6、使用IProgress实现异步编程的进程通知
IProgress<in T>只提供了一个方法void Report(T value),通过Report方法把一个T类型的值报告给IProgress,然后IProgress<in T>的实现类Progress<in T>的构造函数接收类型为Action<T>的形参,通过这个委托让进度显示在UI界面中。
View Code
2.7、Factory.FromAsync的应用 (简APM模式(委托)转换为任务)(BeginXXX和EndXXX)
带回调方式的
View Code
不带回调方式的
View Code
Task启动带参数和返回值的函数任务
分类