新聞速報

        

2023年5月22日 星期一

C# Task.Run 和 Task.Factory.StartNew 區別

 在 .NET 4.0 的時代,可以透過 Task.Factory.StartNew 靜態方法啟用或建立一個新的任務,此靜態方法提供開發者自行定義建立新的 task 任務處理機制,例如控制 TaskScheduler 行為、cancellationToken、creationOptions 等參數,提供相當多的多載方法可依據不同情境使用適合的參數,MSDN 檔案也詳細記錄這些參數加上 sample code說明,但反過來看除非知道這些參數的定義與影響程度,使用上很有可能造成使用不正確的狀況發生 

.NET 4.5 提供了 Task.Run 方法,不需要使用這麼多參數讓開發者在使用上更為方便,實際上 Task.Run 是根據 Task.Factory.StartNew 相同邏輯實現



最關鍵的參數區別是 Task.Run 傳入了 TaskCreationOptions.DenyChildAttach。


DenyChildAttach 的作用是阻止子任務附加到其父任務:

設想下從 Task 對象呼叫第三方庫元件的應用。如果第三方庫元件也建立一個 Task 對象,並指定 TaskCreationOptions.AttachedToParent 以將其附加到父任務中,則子任務中出現的任何未經處理的異常將會傳播到父任務。這可能會導致主應用中出現意外行為。


沒有留言:

張貼留言