gpt4 book ai didi

.net - 您应该将 "Using"用于异步对象吗?

转载 作者:行者123 更新时间:2023-12-02 05:18:57 24 4
gpt4 key购买 nike

为异步对象使用 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

最佳答案

If the block is exited before async task is complete, will the object be disposed too soon?

是的。 End Using 行一完成,Ping 对象就会被释放。

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() 中的代码,您会发现它关闭了各种事件句柄。如果 Ping 对象在异步完成之前被释放,这可能不会导致异常,但它肯定会使 Ping 对象处于不稳定状态。您可能会发现事件未触发或异步完成处理程序代码未被调用或发生其他微妙的事情。

关于.net - 您应该将 "Using"用于异步对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189166/

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