我有乐趣的工作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()
(这似乎是玩俄罗斯轮盘赌。)
而拇指的正常规则是始终调用Dispose()
对所有IDisposable
实现, Task
和Task<T>
往往是一个情况下,最好让终结照顾这。
究其原因任务实现IDisposable
主要是由于内部的WaitHandle。 这是必需的,允许的任务延续到正常工作,当有一个任务的延续只能使用。 如果没有延续,任务的Dispose方法有没有真正的影响 - 所以在这种情况下,它不是必需的。
话虽这么说,在那里有一个任务延续大多数情况下,它往往是非常,非常困难的编写代码的方式,让你正确调用Dispose()。 using语句通常不与任务情况下工作,由于任务调用通常在本质上是异步。 这很容易使用using语句尤其是当处置任务还为时过早。
如果,你的情况,这是相对简单的就可以正确地保持到任务的引用,并调用Dispose(),我会这么做。 但是,如果这是要引起你的逻辑来获得更加复杂,我通常会假装任务不是IDisposable
,并允许它在终结的任务进行清理。
有关详细信息,我建议你阅读MSDN论坛的主题 ,其中斯蒂芬Toub介绍了为什么任务详细实现IDisposable,并提供类似的指导,我的上述建议。