使用任务并行库 (TPL) 启动后台任务而不等待其完成时,会出现以下问题:处理返回的任务对象是至关重要的。本文旨在解决这个问题,并探讨不调用 Dispose() 方法的影响。
在 TPL 中,StartNew() 方法返回一个 Task 对象它实现了 IDisposable 接口。 Task.Dispose() 的 MSDN 文档指出了在释放对 Task 的最后一个引用之前调用 Dispose 的重要性。
一个问题是 Task 对象可能会分配非托管资源,例如等待句柄,需要通过 Dispose() 显式释放以避免内存泄漏。然而,Microsoft pfx 团队的成员 Stephen Toub 澄清说,这种情况不太可能发生。
根据 Toub 的说法,Task 对象仅在等待它们需要阻塞时才分配事件句柄(而不是旋转或执行等待任务)。在使用延续的情况下,永远不会分配此事件句柄。
如果未显式调用,终结器最终将回收与 Task 对象关联的任何非托管资源。然而,依赖终结可能并不理想,特别是在处理大量即发即弃任务时,因为它可能会压垮终结器线程。
总之,一般来说,共识是在大多数情况下通常不需要处理任务对象。以下建议提供指导:
以上是我应该处置 TPL 中的任务对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!