.net - 是否应该将 "Using"用于异步对象?

标签 .net vb.net asynchronous

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

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

相关文章:

c# - 滞后的截图工具

asp.net - 我必须使用 ssl 保护除了几个页面之外的所有页面吗?

c# - PInvoke 和 char**

c# - 如何将泛型类型作为参数传递给 Enum.Parse()

asp.net - 当条件为 false 时执行单语句 VB.NET If block ? VS 2005 的错误?

mysql - VB.Net "mask"组合框文本作为另一个文本

c# - 引用文件的正确方法是什么?

c# - 在 WPF 中的异步登录中设置 CurrentPrincipal

asynchronous - Dart 组件 : How to return result of asynchronous callback?

python - 不同服务器上的 Django 和 celery ,一旦任务完成, celery 能够向 Django 发送回调