2010年6月24日 星期四

TPL 學習日記(6): 等待任務1:等待單一任務

等待任務執行完畢後,再接著執行其他的工作,是相當常見的需求。以下介紹幾種常見的需求。

等待某一任務完成

等待某一任務完成後,接著再執行另一任務。這是最基本的工作了。

static void Main(string[] args)
{
  var tokenSource = new CancellationTokenSource();
  var task1 = createTask(tokenSource.Token);
  task1.Start();
  Console.WriteLine("等待執行完畢,或任務取消,或任務發生 Exception");
  task1.Wait();
  Console.WriteLine("執行完畢"); // task1 會執行完畢

  var task2 = createTask(tokenSource.Token);
  task2.Start();
  Console.WriteLine("等待執行完畢(只等3秒),或任務取消,或任務發生 Exception");
  bool completed = task2.Wait(3000);
  Console.WriteLine("執行完畢:{0}", completed); //task2 仍然繼續執行,只是不等了

  var task3 = createTask(tokenSource.Token);
  task3.Start();
  Console.WriteLine("等待執行完畢(只等3秒),或任務取消,或任務發生 Exception");
  completed = task3.Wait(3000, tokenSource.Token);
  Console.WriteLine("執行完畢:{0}, 是否取消:{1}", completed, task3.IsCanceled);
}

執行結果如下

等待執行完畢,或任務取消,或任務發生 Exception
Task Id 1: 0
Task Id 1: 1
Task Id 1: 2
Task Id 1: 3
Task Id 1: 4
執行完畢
等待執行完畢(只等3秒),或任務取消,或任務發生 Exception
Task Id 2: 0
Task Id 2: 1
Task Id 2: 2
執行完畢:False
等待執行完畢(只等3秒),或任務取消,或任務發生 Exception
Task Id 3: 0
Task Id 2: 3
Task Id 3: 1
Task Id 2: 4
Task Id 3: 2
執行完畢:False, 是否取消:False
Task Id 3: 3
Press any key to continue . . .

Task 有 Wait 的方法可以用來等待該任務完成的條件。
方法 說明
Wait() 等待執行完畢
Wait(Int32) 等待執行完畢,但只等一定的時間(微秒)
Wait(Int32, CancellationToken) 等待執行完畢,但只等一定的時間(微秒),或任務取消。

需要注意的是使用 int 當等待時間,當等待時間到達時,就不再等待而程式繼續向下執行,原本執行的任務依然繼續執行。由輸出中的 Task Id 來看,2 與 3 會交互執行一段時間。

沒有留言:

Share with Facebook