我想在我的应用程序中集成Tasks
类的用法因为我知道完成我的requeriments,因为我只需要启动一个非常简单的异步操作来调用安全的WinAPI方法,然后如果我使用一个非常庞大的解决方案的后台工作者,在我的意见中疯狂只是以这种方式运行一条指令:
Task.Factory.StartNew(Sub() NativeMethods.SomeWrapper)
我需要每分钟多次执行该指令(如100),但我不能等待异步操作完成并使用Wait
方法处理对象,因为即使当前{{1我的意图是启动另一个同一操作的Task
实例并让旧任务仍然有效,所以我不知道Task
是否会处置我的GarbageCollector
个对象当每个任务完成或我需要使用Task
方法手动处理每个任务时自动处理?在这种情况下我很丢失,因为我不知道如何在我提到的这个环境中。
我对这种方法有点困惑,我已经尝试过好奇这个非常简单的测试,每次我执行这个循环,内存增加大约20 mb在我的情况下,我没有看到消耗永远不会被处置,反正,我不是一个探查器专家,但是因为所有的.NET专家都知道vb.net应用程序的内存消耗指标可能非常低效,所以即使使用下面的这个小测试我仍然会消耗:
Dispose
请有人让我毫无疑问。
答案 0 :(得分:6)
Task.Dispose
存在处理内部等待句柄,如果您对Task
执行阻止操作(如调用Wait()
),则会使用该句柄。如果你不这样做,那么调用Dispose
就没有意义了。
对于任务,通常建议不调用Dispose
,除非您有非常具体的情况并且它会导致性能问题。如果有一个等待句柄而你没有Dispose
,那就没有任何伤害 - 它会在某些时候被GC取回。
答案 1 :(得分:4)
GC 始终能够清理通过您的应用程序无法访问的资源。你永远不需要做任何特别的事情来实现这一点。对于在GC的责任范围内不的非托管资源,非常明确地处置。具体而言,任务不需要处理。启动它们后,您不必担心要清理它们。
当然,仅仅因为GC 可以清理托管资源并不一定意味着它会立即这样做。只要有需要,它就可以自由地这样做。你应该让它优化自己;在大多数情况下,试图强迫它采取行动只会导致你的问题。