上篇中,我們看了不帶參數值和返回值的函數(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);