首页 > 后端开发 > C++ > 我是否需要处置'即发即忘”TPL 任务?

我是否需要处置'即发即忘”TPL 任务?

Linda Hamilton
发布: 2025-01-05 16:26:42
原创
854 人浏览过

Do I Need to Dispose of Fire-and-Forget TPL Tasks?

不处置 TPL 任务:后果和替代解决方案

触发任务在后台运行而不等待其完成时,常见的情况使用 Task.Factory.StartNew() 会引发有关在返回的 Task 对象上调用 Dispose() 的必要性的问题。虽然 MSDN 建议处置所有任务,但在这种特定情况下处置任务的问题常常被忽视。

关于不处置的后果,Microsoft PFX 团队成员 Stephen Toub 澄清道Task.Dispose() 的存在是为了处理某些等待场景中使用的事件句柄。但是,当延续是访问任务的主要方式时,将永远不会分配此事件句柄。 Stephen Toub 建议依靠最终确定来管理这些任务。

关于此主题的官方文档是有限的。然而,Stephen Toub 的博客文章“我需要处置任务吗?”扩展了这个问题,并重点介绍了 .Net 4.5 中引入的改进。

一般来说,您不需要处置大多数时候都是 Task 对象。 处置的原因包括及时释放非托管资源并避免终结器成本。但是,这些注意事项通常不适用于 Task 对象:

  • 在 .Net 4.5 及更高版本中,仅在显式使用 IAsyncResult.AsyncWaitHandle 时分配内部等待句柄。
  • Task 对象本身没有终结器;等待句柄包装在带有终结器的对象中,只有在分配句柄时才会运行该终结器。

使用 TPL 执行即发即弃任务的替代方法:

如果任务对象的处置仍然是一个问题,还有其他方法:

  • 使用.Net 3.5 或更高版本中的 ThreadPool.QueueUserWorkItem() 方法。
  • 创建任务而不返回它:Task.Run(() => DoSomething());。
  • 使用任务.ContinueWith 方法附加将执行自动清理的延续。

以上是我是否需要处置'即发即忘”TPL 任务?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板