[C#.NET][TPL] Task Receive return Result
任務返回結果會需要用到以下:
通知任務步驟:
- 利用 Task.ContinueWith 方法,調用子任務。
- 使用 TaskContinuationOptions.OnlyOnRanToCompletion 列舉,做為子任務啟用條件。
- 調用 Task.Result 屬性,來取得結果
更多的內容請參考:
內文章節:
讓我們來看看實際的例子:
1.使用Task<int>來啟動 mainTask 主任務 ,Task<int> 回傳了一個運算結果
2.在子任務裡使用 Task.Result 取得運結果
private void DoWork14() { var mainTask = new Task<int>(() => { int result = 0; for (int i = 0; i < 100; i++) { result++; SpinWait.SpinUntil(() => { m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null); return false; }, 10); } return result; }); mainTask.ContinueWith(task => { var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r", task.IsCanceled, task.IsCompleted, task.IsFaulted); var result = string.Format("計算結果:{0}", task.Result); MessageBox.Show(finish + result); }, TaskContinuationOptions.OnlyOnRanToCompletion); mainTask.Start(); }
寫法跟上個例子一樣,只是把 Task<int> 換成 Task.Factory.StartNew,CLR 自動幫你轉成 Task<int>,在使用上就不需要宣告回傳型別,用起來確實很方便。
private void DoWork15() { var mainTask = Task.Factory.StartNew(() => { int result = 0; for (int i = 0; i < 100; i++) { result++; SpinWait.SpinUntil(() => { m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null); return false; }, 10); } return result; }); mainTask.ContinueWith(task => { var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r", task.IsCanceled, task.IsCompleted, task.IsFaulted); var result = string.Format("計算結果:{0}", task.Result); MessageBox.Show(finish + result); }, TaskContinuationOptions.OnlyOnRanToCompletion); }
Task.Run<int> 是.NET 4.5的產物,用法就跟 Task<int> 一樣,只是不需要另外調用 Start 方法
private void DoWork16() { var mainTask = Task.Run<int>(() => { int result = 0; for (int i = 0; i < 100; i++) { result++; SpinWait.SpinUntil(() => { m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null); return false; }, 10); } return result; }); mainTask.ContinueWith(task => { var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r", task.IsCanceled, task.IsCompleted, task.IsFaulted); var result = string.Format("計算結果:{0}", task.Result); MessageBox.Show(finish + result); }, TaskContinuationOptions.OnlyOnRanToCompletion); }
如下圖,以上三個方法執行結果都相同
以上文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/06/11/105442.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET