首页 >后端开发 >C++ >我应该处置 TPL 中的任务对象吗?

我应该处置 TPL 中的任务对象吗?

Susan Sarandon
Susan Sarandon原创
2025-01-02 21:47:40246浏览

Should I Dispose of Task Objects in the TPL?

了解 TPL 中任务处置的需求

使用任务并行库 (TPL) 启动后台任务而不等待其完成时,会出现以下问题:处理返回的任务对象是至关重要的。本文旨在解决这个问题,并探讨不调用 Dispose() 方法的影响。

Task 对象及其 IDisposable 实现

在 TPL 中,StartNew() 方法返回一个 Task 对象它实现了 IDisposable 接口。 Task.Dispose() 的 MSDN 文档指出了在释放对 Task 的最后一个引用之前调用 Dispose 的重要性。

关于非托管资源分配的担忧

一个问题是 Task 对象可能会分配非托管资源,例如等待句柄,需要通过 Dispose() 显式释放以避免内存泄漏。然而,Microsoft pfx 团队的成员 Stephen Toub 澄清说,这种情况不太可能发生。

根据 Toub 的说法,Task 对象仅在等待它们需要阻塞时才分配事件句柄(而不是旋转或执行等待任务)。在使用延续的情况下,永远不会分配此事件句柄。

作为后备的终结

如果未显式调用,终结器最终将回收与 Task 对象关联的任何非托管资源。然而,依赖终结可能并不理想,特别是在处理大量即发即弃任务时,因为它可能会压垮终结器线程。

建议

总之,一般来说,共识是在大多数情况下通常不需要处理任务对象。以下建议提供指导:

  • 如果您的代码显式使用 Task 对象的 AsyncWaitHandle 属性,则应处置该 Task 以释放非托管等待句柄。
  • 在所有其他情况下在这种情况下,即使在处理大量即发即忘的任务时,依靠最终确定通常就足够了。

以上是我应该处置 TPL 中的任务对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn