概述
ThreadPool相比Thread來說具備了很多優勢,但是ThreadPool卻又存在一些使用上的不方便。比如:
◆ ThreadPool不支持線程的取消、完成、失敗通知等交互性操作;
◆ ThreadPool不支持線程執行的先后次序;
Task在線程池的基礎上進行了優化,並提供了更多的API。
1.async和await的使用
用async來修飾一個方法,表明這個方法是異步的,聲明的方法的返回類型必須為:void或Task或Task<TResult>。
await修飾的只能是Task或者Task<TResule>類型,await修飾的Task/Task<TResult>得到的是TResult。
注意它很可能會引起的死鎖,處理辦法是把返回值也做成異步方法,如下所示,加await修飾
private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { Thread.Sleep(5000); return "Hello I am TimeConsumingMethod"; }); textBox1.Text = await t; }
2.task中途取消任務
//聲明CancellationTokenSource對象 static CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); static void Main(string[] args) { Task.Factory.StartNew(MyTask, cancelTokenSource.Token); Console.WriteLine("請按回車鍵(Enter)停止"); Console.ReadLine(); cancelTokenSource.Cancel(); Console.WriteLine("已停止"); Console.ReadLine(); } //測試方法 static void MyTask() { //判斷是否取消任務 while (!cancelTokenSource.IsCancellationRequested) { Console.WriteLine(DateTime.Now); Thread.Sleep(1000); } }
利用CancellationTokenSource 。
使用計時取消任務,當一個任務超過了我們所設定的時間然后自動取消該任務的執行。
var cancelTokenSource = new CancellationTokenSource(3000);
或
cancelTokenSource.CancelAfter(3000);
參考自:C# task 取消線程
