我希望在后台线程上触发一个任务,并且不需要等待任务完成。
在 .net 3.5 中,我会这样做:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
在 .net 4 中,TPL 是推荐的方式。我看到被推荐的常见模式是:
Task.Factory.StartNew(() => { DoSomething(); });
然而,StartNew()
方法返回一个实现 IDisposable
接口的Task
对象。这个模式被推荐的人似乎忽略了这一点。在Task.Dispose()
方法的 MSDN 文档中说:
在任务完成之前无法调用任务的处理程序,因此,在主线程等待并调用处理程序将首先在后台线程上执行其目的。也没有任何完成/结束事件可用于清理。"在释放对 Task 的最后引用之前始终调用 Dispose。"
任务类的 MSDN 页面没有对此进行评论,《Pro C#2010...》一书推荐相同的模式,并没有对任务处理进行评论。
我知道如果我只是把它留下,最终器将在最后捕捉到它,但是当我执行许多这样的fire & forget任务时,最终器线程是否会遇到问题?
所以我的问题是:
- 在这种情况下不调用
Task
类的Dispose()
方法是否可行?如果可以,为什么?会有什么风险/后果吗? - 是否存在讨论此内容的任何文档?
- 是否有适当的方法来处理我错过的
Task
对象? - 或者,是否有其他使用TPL进行fire & forget任务的方式?