摘要:[.NET][Task] Task.Factory.StartNew 接續執行同步方法
情境很簡單,正常執行一個要很久的方法,並要顯示在UI畫面上,則會先使用非同步,之後才會執行同步方法,將結果等更新至UI畫面上。
private void Form1_Load(object sender, EventArgs e)
{
var task = Task.Factory.StartNew(() =>
{
// 任意做了一些長久的事情
int counter = 0;
for (int i = 0; i < 100000; i++)
{
counter += i;
}
return counter;
}).ContinueWith((taskResult) =>
{
// 顯示在 Form 的視窗標題上
this.Test = taskResult.Result.ToString();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
第一我們使用 Task.Factory.StartNew 靜態方法來啟動一個非同步的匿名方法,
這匿名方法內只是做些簡單的計算,並傳回計算整數結果,
後續我們想先這整數結果設定到視窗標題上,
但在非同步(另一個非主UI的執行緒上)執行方法時,因為這時候並無法對UI元件做任何存取,
解決的方法就是回到同步執行緒(UI的主執行緒)上,在將要設定的內容設定至UI元件上,
在還沒有 Task 之前,可能會使用 BackgroundWorker 或 Thread 更麻煩的寫法來達成同步這件事情,
但現在更方便了,只要 Task.Factory.StartNew 靜態方法傳入一個在 UI主執行緒取得的 TaskScheduler ,
就能在最後面接續回到 UI執行緒上做畫面的設定與更新,這一切的關鍵就是 TaskScheduler.FromCurrentSynchronizationContext() 。
如果不太明白為什麼要一定要在UI執行緒上取得的話,要先去理解 Thread 的觀念才會更好明白。