2019年2月7日 星期四

簡介.NET 4.0的多工執行利器--Task

https://blog.darkthread.net/blog/net4-task/


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()方法即可。看看下面這個控制臺示例。純粹是WaitAllWait的話,僅僅是等待。而不是執行。所以我們還需要調用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);
    }
}

TaskWebApi中的運用

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

沒有留言:

張貼留言