使用任務並行庫(TPL) 啟動後台任務而不等待其完成時,會出現以下問題:處理返回的任務對像是至關重要的。本文旨在解決這個問題,並探討不呼叫 Dispose() 方法的影響。
在 TPL 中,StartNew() 方法傳回一個 Task 物件它實作了 IDisposable 介面。 Task.Dispose() 的 MSDN 文件指出了在釋放對 Task 的最後一個引用之前呼叫 Dispose 的重要性。
一個問題是 Task 物件可能會分配非託管資源,例如等待句柄,需要透過 Dispose() 明確釋放以避免記憶體洩漏。然而,Microsoft pfx 團隊的成員 Stephen Toub 澄清說,這種情況不太可能發生。
根據 Toub 的說法,Task 物件僅在等待它們需要阻塞時才分配事件句柄(而不是旋轉或執行等待任務)。在使用延續的情況下,永遠不會指派此事件句柄。
如果未明確調用,終結器最終將回收與 Task 物件關聯的任何非託管資源。然而,依賴終結可能並不理想,特別是在處理大量即發即棄任務時,因為它可能會壓垮終結器執行緒。
總之,一般來說,共識是在大多數情況下通常不需要處理任務對象。以下建議提供指導:
以上是我應該處置 TPL 中的任務對象嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!