Threading.Tasks Dispose意义问题

时间:2014-09-30 17:38:37

标签: .net vb.net multithreading asynchronous

我想在我的应用程序中集成Tasks类的用法因为我知道完成我的requeriments,因为我只需要启动一个非常简单的异步操作来调用安全的WinAPI方法,然后如果我使用一个非常庞大的解决方案的后台工作者,在我的意见中疯狂只是以这种方式运行一条指令:

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

我需要每分钟多次执行该指令(如100),但我不能等待异步操作完成并使用Wait方法处理对象,因为即使当前{{1我的意图是启动另一个同一操作的Task实例并让旧任务仍然有效,所以我不知道Task是否会处置我的GarbageCollector个对象当每个任务完成或我需要使用Task方法手动处理每个任务时自动处理?在这种情况下我很丢失,因为我不知道如何在我提到的这个环境中。

我对这种方法有点困惑,我已经尝试过好奇这个非常简单的测试,每次我执行这个循环,内存增加大约20 mb在我的情况下,我没有看到消耗永远不会被处置,反正,我不是一个探查器专家,但是因为所有的.NET专家都知道vb.net应用程序的内存消耗指标可能非常低效,所以即使使用下面的这个小测试我仍然会消耗:

Dispose

请有人让我毫无疑问。

2 个答案:

答案 0 :(得分:6)

Task.Dispose存在处理内部等待句柄,如果您对Task执行阻止操作(如调用Wait()),则会使用该句柄。如果你不这样做,那么调用Dispose就没有意义了。

对于任务,通常建议调用Dispose,除非您有非常具体的情况并且它会导致性能问题。如果有一个等待句柄而你没有Dispose,那就没有任何伤害 - 它会在某些时候被GC取回。

答案 1 :(得分:4)

GC 始终能够清理通过您的应用程序无法访问的资源。你永远不需要做任何特别的事情来实现这一点。对于在GC的责任范围内的非托管资源,非常明确地处置。具体而言,任务不需要处理。启动它们后,您不必担心要清理它们。

当然,仅仅因为GC 可以清理托管资源并不一定意味着它会立即这样做。只要有需要,它就可以自由地这样做。你应该让它优化自己;在大多数情况下,试图强迫它采取行动只会导致你的问题。