1. 程式人生 > >C# task用法

C# task用法

我們 font actor oca 調度 研究 等待 static ken

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運行結束為止。

C# task用法