相关疑难解决方法(0)

不在TPL Task对象上调用Dispose()是否可以接受?

我想触发一个在后台线程上运行的任务.我不想等待任务完成.

在.net 3.5中,我会这样做:

ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

在.net 4中,TPL是建议的方式.我见过的常见模式是:

Task.Factory.StartNew(() => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

但是,该StartNew()方法返回一个Task实现的对象IDisposable.推荐这种模式的人似乎忽视了这一点.有关该Task.Dispose()方法的MSDN文档说:

"在释放对任务的最后一个引用之前,始终调用Dispose."

你不能在任务完成之前调用dispose,所以让主线程等待并调用dispose会首先打破后台线程上的操作.似乎也没有任何已完成/已完成的事件可用于清理.

Task类上的MSDN页面没有对此进行评论,并且"Pro C#2010 ..."一书推荐了相同的模式,并且没有对任务处理做出评论.

我知道如果我离开它,终结者最终会抓住它,但当我做了大量的火灾并且忘记了这样的任务并且终结者线程被淹没时,它会回来咬我吗?

所以我的问题是:

  • 是否可以接受不叫Dispose()Task在这种情况下类?如果是这样,为什么会有风险/后果?
  • 有没有讨论这个的文件?
  • 或者是否有适当的方法来处理Task我错过的物体?
  • 或者是否有其他方法可以使用TPL执行解雇和忘记任务?

.net c# multithreading dispose task-parallel-library

117
推荐指数
2
解决办法
2万
查看次数