使用任务并行库执行即发即弃任务:处置问题
使用任务并行触发即发即弃任务时库(TPL)中,开发人员通常面临有关正确处理任务对象的问题。虽然 MSDN 文档强调需要在发布最后一个引用之前调用 Dispose(),但不这样做的实际影响尚不清楚。
根据 Microsoft 的 Stephen Toub 的说法,任务处置主要是为了处理潜在的非托管资源等待任务完成时使用。但是,在仅使用延续的场景中(例如在“即发即弃”任务中),不会分配此事件句柄。
在最近的一篇博客文章中,Toub 进一步阐明,在 .Net 4.5 中,内部仅当显式检索 IAsyncResult.AsyncWaitHandle 属性时才分配等待句柄。而且,Task对象本身没有终结器;相反,句柄被封装在带有终结器的对象中。除非分配句柄,否则不会调用终结器。
摘要
基于这些见解:
在大多数情况下,是的,不调用 Dispose() 是可以接受的。终结器将处理清理。
是的,Stephen Toub 的博客文章提供了详细的解释。
大多数情况下不需要调用 Dispose()。
不,使用的模式Task.Factory.StartNew() 是执行即忘任务的建议方法。
以上是我应该在 TPL 中处理'即发即忘”任务吗?的详细内容。更多信息请关注PHP中文网其他相关文章!