我想触发一个在后台线程上运行的任务.我不想等待任务完成.
在里面net 3.5我会这样做:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
在.NET4中,建议使用TPL.我看到推荐的常见模式是:
Task.Factory.StartNew(() => { DoSomething(); });
然而,StartNew()
方法返回一个Task
对象,它实现IDisposable
.这
"在释放对任务的最后引用之前,请始终调用Dispose."
在任务完成之前不能对其调用Dispose,因此让主线程等待并调用Dispose首先会 destruct 对后台线程执行操作的意义.似乎也没有任何已完成/已完成事件可用于清理.
Task类上的MSDN页面没有对此进行 comments ,还有《Pro C#2010推荐相同的模式,对任务处理不做 comments .
我知道如果我把它放在一边,终结器最终会抓住它,但是当我做很多火的时候,它会回来咬我吗?忘掉像这样的任务,终结器线程会不堪重负吗?
所以我的问题是:
- 在这种情况下,
Task
班不打Dispose()
分可以接受吗?如果是,为什么会有风险/后果? - 是否有任何文档对此进行了讨论?
- 或者有没有合适的方法来处理我错过的
Task
件物品? - 还是有其他的方法来灭火;忘记TPL的任务?