爲什麼我們需要Task.ContinueWith()
方法。我們不能只在任務主體內寫入「延續代碼」嗎?爲什麼我們需要ContinueWith方法?
18
A
回答
9
有時你會從外面收到一份任務,並希望將其延續鏈接到它。還有一些方法可以創建沒有Action的任務(例如使用TaskCompletionSource)。
5
任務延續允許你任務的鏈,鏈中的每個任務之後是一個其他任務
同樣在Task.ContinueWith
方法可以異步地檢查Task
與TaskContinuationOptions
當目標Task
完成或出現錯誤
Task task = Task.Factory.StartNew
(
() =>
{
//Your action when the task started
}
);
task.ContinueWith
(
_ =>
{
//Your action when the task completed
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
task.ContinueWith
(
(t) =>
{
//Action when error occured
Exception exception = null;
if (t.Exception.InnerException != null)
{
exception = t.Exception.InnerException;
}
else
{
exception = t.Exception;
}
//You can use this exception
},
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()
);
欲瞭解更多信息,看看here
10
薩沙Goldshtein的答案是正確的。有些情況下,您的「繼續」組合代碼無法直接訪問,甚至無法設置任務的執行方法。例如,一個想要彙總taks的可插拔系統。
但是,還有另一個可能適用的原因。粒度
考慮可能會引起使用TaskCreationOptions.LongRunning的要求。在正在調度,執行和完成數百個進程的並行系統中,任務調度程序正在努力在調度任務時提高處理器的親和力。
如果您處於可以將任務細分爲細粒度子任務並鏈接它們的情況,則不再需要使用TaskCreationOptions.LongRunning。簡單地說,這將會更好地執行,因爲更容易同時安排100個小任務,而不是在只有4個核心可用的環境中安排10個大任務來完成相同任務。請記住,鏈接任務不保證在先行後立即啓動。
這是一個有趣的問題,只有當您需要一個可擴展的系統時纔會成爲問題。
如果你問我,你應該儘可能使用ContinueWith(),因爲它會幫助你的應用程序擴展。
相關問題
- 1. 爲什麼我們需要addRequestHeader方法?
- 2. 爲什麼我們需要Buffer.isBuffer方法?
- 3. 爲什麼我們需要用戶的方法:Angular2
- 4. 爲什麼我們需要使用AsEnumerable()方法?
- 5. 爲什麼我們需要指定init方法?
- 6. 爲什麼我們需要YII中的規則方法?
- 7. 爲什麼我們需要(HEX | OCT)_to_DEC方法?
- 8. 爲什麼我們需要將布爾值傳遞給方法
- 9. 爲什麼我們需要System類來調用out.println()方法?
- 10. 爲什麼我們需要重寫方法 - objective c?
- 11. 爲什麼我們需要在stringbuilder中使用toString方法
- 12. DavLockDB:我們需要什麼?
- 13. 爲什麼我們需要simple_one_for_one?
- 14. 爲什麼我們需要TensorFlow tf.Graph?
- 15. 爲什麼我們需要使用prompt.start()?
- 16. 爲什麼我們需要scalaz.stream迭代?
- 17. 爲什麼我們需要WCF
- 18. 爲什麼我們需要Anaconda 2.7?
- 19. 爲什麼我們需要編寫log.isDebugEnabled?
- 20. 爲什麼我們需要ng-click?
- 21. 爲什麼我們需要Control.Lens.Reified?
- 22. 我們爲什麼需要纖維
- 23. 爲什麼我們需要org.junit.ComparisonFailure?
- 24. 爲什麼我們需要時代?
- 25. 爲什麼我們需要Java NIO Selector?
- 26. 爲什麼我們需要使用ExitWindowsEx
- 27. 爲什麼我們需要包裝類
- 28. 爲什麼我們需要在JavaScript
- 29. 爲什麼我們需要設置SONAR_RUNNER_OPTS?
- 30. 爲什麼我們需要ioc容器