「即發即棄」後台任務是否需要進行任務處置?
在後台執行緒上執行「即發即棄」任務時,開發人員經常使用任務並行庫(TPL)方法Task.Factory.StartNew()。此方法傳回一個 Task 對象,引發對正確處置的擔憂。
msdn 文件 建議在釋放對 Task 的最後一個引用之前呼叫 Dispose()。然而,等待任務完成來呼叫此方法就否定了後台執行的目的。
討論
根據 Microsoft pfx 團隊的 Stephen Toub 的說法,任務物件可以等待事件完成時包裝事件句柄。但是,如果使用延續,則永遠不會指派該句柄。因此,最終確定是一種適當的清理方法。
更新(2012 年 10 月)
Toub 的部落格文章 「我需要處置任務嗎?」 提供了進一步的說明。在 .NET 4.5 中,任務僅在明確使用 AsyncWaitHandle 時指派內部等待句柄。此外,Task 沒有終結器;任何分配的句柄都被包裝在帶有終結器的物件中。這意味著處置大多數 Task 物件是不必要的。
結論
在大多數情況下,避免對用於火災的 Task 物件調用 Dispose() 是可以接受的- 忘記後台任務。最終確定通常足以進行資源清理。但是,如果使用 AsyncWaitHandle 或應用程式嚴重依賴此類任務,則可能需要明確處置。
以上是我是否需要在「即發即忘」後台操作中處理任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!