“即发即弃”后台任务是否需要进行任务处置?
在后台线程上执行“即发即弃”任务时,开发人员经常使用任务并行库(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中文网其他相关文章!