不处置 TPL 任务:后果和替代解决方案
触发任务在后台运行而不等待其完成时,常见的情况使用 Task.Factory.StartNew() 会引发有关在返回的 Task 对象上调用 Dispose() 的必要性的问题。虽然 MSDN 建议处置所有任务,但在这种特定情况下处置任务的问题常常被忽视。
关于不处置的后果,Microsoft PFX 团队成员 Stephen Toub 澄清道Task.Dispose() 的存在是为了处理某些等待场景中使用的事件句柄。但是,当延续是访问任务的主要方式时,将永远不会分配此事件句柄。 Stephen Toub 建议依靠最终确定来管理这些任务。
关于此主题的官方文档是有限的。然而,Stephen Toub 的博客文章“我需要处置任务吗?”扩展了这个问题,并重点介绍了 .Net 4.5 中引入的改进。
一般来说,您不需要处置大多数时候都是 Task 对象。 处置的原因包括及时释放非托管资源并避免终结器成本。但是,这些注意事项通常不适用于 Task 对象:
使用 TPL 执行即发即弃任务的替代方法:
如果任务对象的处置仍然是一个问题,还有其他方法:
以上是我是否需要处置'即发即忘”TPL 任务?的详细内容。更多信息请关注PHP中文网其他相关文章!