Task的使用,並介紹如何中途關閉任務


概述

ThreadPool相比Thread來說具備了很多優勢,但是ThreadPool卻又存在一些使用上的不方便。比如:
  ◆ ThreadPool不支持線程的取消、完成、失敗通知等交互性操作;
  ◆ ThreadPool不支持線程執行的先后次序;
Task在線程池的基礎上進行了優化,並提供了更多的API。

1.async和await的使用

 參考:C# 徹底搞懂async/await

async來修飾一個方法,表明這個方法是異步的,聲明的方法的返回類型必須為:voidTaskTask<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);
            }
        }
View Code

利用CancellationTokenSource 。

使用計時取消任務,當一個任務超過了我們所設定的時間然后自動取消該任務的執行。

var cancelTokenSource = new CancellationTokenSource(3000);

cancelTokenSource.CancelAfter(3000);

 

參考自:C# task 取消線程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM