C# task用法


C# Task 的用法

 

其實Task跟線程池ThreadPool的功能類似,不過寫起來更為簡單,直觀。代碼更簡潔了,使用Task來進行操作。可以跟線程一樣可以輕松的對執行的方法進行控制。

順便提一下,配合CancellationTokenSource類更為可以輕松的對Task操作的代碼進行中途終止運行。

 

創建Task

創建Task有兩種方式,一種是使用構造函數創建,另一種是使用 Task.Factory.StartNew 進行創建。如下代碼所示

1.使用構造函數創建Task

 Task t1 = new Task(MyMethod);

 2.使用Task.Factory.StartNew 進行創建Task

Task t1 = Task.Factory.StartNew(MyMethod);

其實這兩種方式都是一樣的,Task.Factory 是對Task進行管理,調度管理這一類的。好學的伙伴們,可以深入研究。這不是本文的范疇,也許會在后面的文章細說。

運行 Task

運行Task的兩種方式,在上面我們已經提到過了,一種等待運行完畢,另一種則等待所有運行完畢。不過這里還有一種就是異步運行跟使用多線程一樣,調用Task對象中的Start()方法即可。看看下面這個控制台示例。純粹是Wait和AllWait的話,僅僅是等待。而不是執行。所以我們還需要調用Start()方法

static void Main(string[] args)
{
    Task t1 = new Task(MyMethod);
    t1.Start();
    Console.WriteLine("主線程代碼運行結束");
    Console.ReadLine();
}
 
static void MyMethod()
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(DateTime.Now.ToString());
        Thread.Sleep(1000);
    }
}

Task在WebApi中的運用

        static async Task MainAsync()
        {
            // your async code here
            var _httpClient = new HttpClient();
            _httpClient.BaseAddress = new Uri("http://localhost:48959/");
             token = await GetAccessToken();
            Console.WriteLine(token);
            Console.WriteLine(token.Length);
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            Console.WriteLine(await (await _httpClient.GetAsync("/currnetUser")).Content.ReadAsStringAsync());
            Console.ReadKey();
        }
    static  void Main(string[] args)
        {
            MainAsync().Wait();
        }

在一個線程調用Wait方法時,系統會檢查線程要等待的Task是否已經開始執行,如果任務正在執行,那么這個Wait方法會使線程阻塞,直到Task運行結束為止。

 


免責聲明!

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



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