我肯定還有其他的,可以給你.NET Framework的基礎行爲的詳細解釋,但結果是,通過將事件處理程序,對象將活到觸發事件是即使處置。
您可以通過以下修改證明了這一點:
' Add any initialization after the InitializeComponent() call.
For i = 1 To 4
System.Threading.Thread.Sleep(10)
Using pPing As New System.Net.NetworkInformation.Ping
AddHandler pPing.PingCompleted, AddressOf pingHandler
AddHandler pPing.Disposed, AddressOf pingDisposed
pPing.SendAsync("someaddressthatmayormaynotwork.com", 10000)
End Using
Next i
GC.Collect()
Console.WriteLine("completed")
Public Sub pingHandler(sender As Object, e As System.Net.NetworkInformation.PingCompletedEventArgs)
Console.WriteLine("pingCompleted")
End Sub
Public Sub pingDisposed(sender As Object, e As System.EventArgs)
Console.WriteLine("Disposed")
End Sub
在這種情況下,處置事件可以pingHandler事件之前進行發射被觸發,如果時間過長,找到的網址或接收的響應,但pingHandler事件將始終觸發。
在一般情況下,它是釋放事件中的異步事件處理程序,這樣你就不會與作用域/關閉場景結束這樣一個最佳實踐:
Public Sub pingHandler(sender As Object, e As System.Net.NetworkInformation.PingCompletedEventArgs)
If sender IsNot Nothing Then
RemoveHandler DirectCast(sender, System.Net.NetworkInformation.Ping).PingCompleted, AddressOf pingHandler
End If
Console.WriteLine("pingCompleted")
End Sub
Public Sub pingDisposed(sender As Object, e As System.EventArgs)
If sender IsNot Nothing Then
RemoveHandler DirectCast(sender, System.Net.NetworkInformation.Ping).Disposed, AddressOf pingDisposed
End If
Console.WriteLine("Disposed")
End Sub
Competent_tech幾乎是正確的,對象即使在處置後也會生存。只是這不會在100%的時間內發生。正如Thilak Nathen所說,結果是不確定的。 在End End後面使用ping對象,直到Sub退出,然後有時最後一個事件不會觸發。我結束了使用後臺工作者和同步ping。 – xpda