[.NET][Task] Task.Factory.StartNew 接續執行同步方法

  • 2311
  • 0

摘要:[.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 的觀念才會更好明白。