我需要处理的任务的?我需要处理的任务的?(Do I need to dispose of a Tas

2019-05-12 10:47发布

我有乐趣的工作System.Threading.Tasks 。 许多代码示例我看到的,但是,看起来就像这样:

Dim lcTask = Task.Factory.StartNew(Sub() DoSomeWork())
Dim lcTaskLong = Task.Factory.StartNew(Sub() DoSomeWork(), TaskCreationOptions.LongRunning)
Task.WaitAll(lcTask, lcTaskLong)

这是样品的程度。
任务实施IDisposable ,所以很明显我应该处理掉,但如果我只是想“射后不理”是什么?

如果我不处理,我会泄漏线程/手柄/内存/噶? 我使用任务“错”? (应该只使用一个委托,并独自离开任务是什么?)

我可以在配置ContinueWith() (这似乎是玩俄罗斯轮盘赌。)

Answer 1:

而拇指的正常规则是始终调用Dispose()对所有IDisposable实现, TaskTask<T>往往是一个情况下,最好让终结照顾这。

究其原因任务实现IDisposable主要是由于内部的WaitHandle。 这是必需的,允许的任务延续到正常工作,当有一个任务的延续只能使用。 如果没有延续,任务的Dispose方法有没有真正的影响 - 所以在这种情况下,它不是必需的。

话虽这么说,在那里有一个任务延续大多数情况下,它往往是非常,非常困难的编写代码的方式,让你正确调用Dispose()。 using语句通常不与任务情况下工作,由于任务调用通常在本质上是异步。 这很容易使用using语句尤其是当处置任务还为时过早。

如果,你的情况,这是相对简单的就可以正确地保持到任务的引用,并调用Dispose(),我会这么做。 但是,如果这是要引起你的逻辑来获得更加复杂,我通常会假装任务不是IDisposable ,并允许它在终结的任务进行清理。

有关详细信息,我建议你阅读MSDN论坛的主题 ,其中斯蒂芬Toub介绍了为什么任务详细实现IDisposable,并提供类似的指导,我的上述建议。



文章来源: Do I need to dispose of a Task?