gpt4 book ai didi

.net - 我需要处理任务吗?

转载 作者:行者123 更新时间:2023-12-03 14:06:57 25 4
gpt4 key购买 nike

我和 System.Threading.Tasks 一起工作很开心.然而,我看到的许多代码示例看起来像这样:

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

这就是样本的范围。
任务执行 IDisposable ,所以很明显我应该处理掉它们,但如果我只想“一劳永逸”呢?

如果我不处理,我会泄漏线程/句柄/内存/业力吗?
我是否使用“错误”的任务? (应该只使用委托(delegate)并单独留下任务吗?)

我可以在 ContinueWith() 中处理吗? ? (这好像在玩俄罗斯轮盘赌。)

最佳答案

虽然通常的经验法则是始终调用 Dispose()全部IDisposable实现,TaskTask<T>通常情况下,最好让终结者来处理这个问题。

Task 实现的原因 IDisposable主要是由于内部的WaitHandle。这是允许任务延续正常工作所必需的,并且仅在任务上有延续时使用。如果没有继续,则 Task 的 Dispose 方法没有实际效果 - 所以在这种情况下,它不是必需的。

话虽如此,在大多数有任务延续的情况下,以一种允许您正确调用 Dispose() 的方式编写代码通常非常非常困难。 Using 语句通常不适用于 Task 实例,因为 Task 调用本质上通常是异步的。过早地处理任务很容易,尤其是在使用 using 语句时。

如果在您的情况下,保留对 Task 的引用并正确调用 Dispose() 相对简单,我会这样做。但是,如果这会导致您的逻辑变得更加复杂,我通常会假装 Task 不是 IDisposable。 ,并允许在任务的终结器中对其进行清理。

更多详情,我推荐reading this thread on the MSDN forums其中 Stephen Toub 详细描述了 Task 实现 IDisposable 的原因,并为我上面的建议提供了类似的指导。

关于.net - 我需要处理任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5985973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com