最佳答案
我想触发一个任务,在后台线程上运行。我不想等任务完成。
在.net 3.5中,我会这样做:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
在.net 4中,TPL 是建议的方式。我看到的建议的常见模式是:
Task.Factory.StartNew(() => { DoSomething(); });
但是,StartNew()
方法返回一个实现 IDisposable
的 Task
对象
推荐这种模式的人似乎忽略了这一点。关于 Task.Dispose()
方法的 MSDN 文档说:
“总是在释放对任务的最后引用之前调用 Dispose。”
在任务完成之前,不能对其进行释放调用,因此让主线程等待和调用释放将首先破坏在后台线程上进行释放的目的。似乎也没有任何已完成/已完成的事件可用于清理。
Task 类上的 MSDN 页面没有对此进行评论,而书籍“ Pro C # 2010...”推荐了同样的模式,并且没有对任务处理进行评论。
我知道,如果我只是离开它,终结器将赶上它的最后,但这会回来咬我,当我正在做很多火和忘记任务像这样,终结器线程得到超负荷?
所以我的问题是:
Task
类调用 Dispose()
是否可以接受?如果是这样,为什么会有风险/后果?Task
对象?