gpt4 book ai didi

.net - Threading.Tasks Dispose 含义问题

转载 作者:行者123 更新时间:2023-12-02 15:09:48 26 4
gpt4 key购买 nike

我想在我的应用程序中集成 Tasks 类的用法,因为我知道它可以满足我的要求,因为我只需要启动一个非常简单的异步操作来调用安全的 WinAPI 方法,那么如果我使用后台 worker ,这将是一个非常巨大的解决方案,并且在我看来,仅以这种方式运行一条指令是疯狂的:

Task.Factory.StartNew(Sub() NativeMethods.SomeWrapper)

我需要每分钟多次执行该指令(例如 100 次),但我无法等待异步操作完成并使用 Wait 方法处置对象,因为即使当前Task 还活着,我的目的是启动相同操作的另一个 Task 实例,并让旧任务仍然工作,所以我不知道 GarbageCollector 将在每项任务完成时自动处置我的 Task 对象,或者我需要使用 Dispose 方法手动处置每个对象?在这种情况下,我非常迷失'因为我不知道在我提到的这种情况下该怎么做。

我对这个方法有点困惑,出于好奇,我尝试了下面这个非常简单的测试,每次执行这个循环时,在我的例子中,内存都会增加大约 20 mb,而且我没有看到这种消耗无论如何,我不是分析器专家,但所有 .NET 专家都知道 vb.net 应用程序的内存消耗指标可能非常低效,所以即使进行了下面的这个小测试,我仍然感到满意:

For x As Integer = 0 To 99999
Task.Factory.StartNew(Sub() NativeSafeMethods.SomeSafeWrapper)
Next

请有人帮我消除疑虑。

最佳答案

Task.Dispose 的存在是为了处置内部等待句柄,如果您对 Task 执行阻塞操作(例如调用 Wait())。如果您不这样做,则调用 Dispose 就没有意义。

对于任务,通常建议不要调用Dispose,除非您遇到非常具体的场景并且它会导致性能问题。如果有等待句柄并且您没有Dispose,也没有什么坏处——它会在某个时刻被 GC 拾取。

关于.net - Threading.Tasks Dispose 含义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26126810/

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