C# task用法
阿新 • • 發佈:2017-06-08
我們 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 voidMain(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用法