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運行結束為止。
沒有留言:
張貼留言