天天看點

【C#】44. Task<T> 根據帶傳回值的函數構造Task

上篇中,我們看了不帶參數值和傳回值的函數(Action)構造Task的方法,本篇中我們想Thread一樣,看看如何給Task傳參和傳回值。

首先定義int TaskMethod(String)函數,該函數以String作為參數,傳回Int類型結果:

static int TaskMethod(string name)
{
Console.WriteLine("Task {0} 運作線上程id為{1}的線程上。是否是線程池中線程?:{2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(2000);
return 42;
}
           
static Task<int> CreateTask(string name)
{
return new Task<int>(() => TaskMethod(name));
}
           

一、最簡單的構造Task的方式為使用lambda表達式:

Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
task.Start();
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
           

需要注意的是,我們構造了Task<int>任務,然後Start(),之後傳回值即task. Result屬性!由于Result的關系, 是以線程将等待result得到後再往下進行。

【C#】44. Task&lt;T&gt; 根據帶傳回值的函數構造Task

二、Task同步運作RunSynchronously

Task<int>  task = CreateTask("Task 2");
task.RunSynchronously(); //運作在主線程中,等同于直接運作: TaskMethod("Task 2");
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
           

這裡沒有使用Start()而是使用 RunSynchronously(),直接同步運作!等同于直接運作 Result =  TaskMethod("Task 2");

是以,該Task不是運作線上程池中,而是運作在主線程中。

【C#】44. Task&lt;T&gt; 根據帶傳回值的函數構造Task

三、Task的運作狀态

Task<int> task = CreateTask("Task 3");
Console.WriteLine(task.Status);
task.Start();
while (!task.IsCompleted)
{
Console.WriteLine(task.Status);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
}
Console.WriteLine(task.Status);
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
           

上面的代碼使用了狀态判斷(IsCompleted)輪查方式,輸出了不同的Task狀态。等到task執行完畢後,也就自然得到int結果。

【C#】44. Task&lt;T&gt; 根據帶傳回值的函數構造Task