【C#】44. Task 根據帶返回值的函數構造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得到後再往下進行


二、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不是運行在線程池中,而是運行在主線程中



三、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結果。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章