对异步对象使用 Using
block 是否安全?如果在异步任务完成之前退出 block ,对象是否会被过早释放?任务完成后会被妥善处理吗?
这段代码可以工作,但我不知道它是否滥用我的内存。
For i = 1 To nPings
Thread.Sleep(10)
Using pPing As New System.Net.NetworkInformation.Ping
AddHandler pPing.PingCompleted, AddressOf pingHandler
pPing.SendAsync(ip, timeout)
End Using
Next i
最佳答案
block 引用>If the block is exited before async task is complete, will the object be disposed too soon?
是的。尽快
End Using
线路完成后,Ping
对象将被处置。block 引用>Will it be disposed properly when the task completes?
在您的示例中,
Ping
对象将始终被丢弃。但是,在异步代码完成后,这可能会发生,也可能不会发生,因为该行为(您编码的方式)尚未确定。为了使此行为更具确定性,请在
pingHandler
中处理 Ping 对象。代码,这样:Class PingAsyncState Public Property Ping Ping Public Property int Timeout End Class For i = 1 To nPings Thread.Sleep(10) pPing As New System.Net.NetworkInformation.Ping AddHandler pPing.PingCompleted, AddressOf pingHandler pPing.SendAsync(ip, new PingAsyncState() With { .Ping = pPing, .Timeout = timeout }) Next i Sub PingHandler(obj As Object) Dim state = CType(state, PingAsyncState) ... code to do stuff ... state.Ping.Dispose() End Sub
此外,如果您检查
Ping.Dispose()
内的代码,您会看到它关闭了各种 EventHandles。如果Ping
,这可能不会导致异常对象在异步完成之前被释放,但它肯定会放置Ping
物体处于不稳定状态。您可能会发现事件未触发或异步完整处理程序代码未被调用或发生其他微妙的事情。
关于.net - 是否应该将 "Using"用于异步对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189166/