我正在研究一个用VB.NET编写的旧系统,它在应用程序关闭时不断抛出异常,因为它试图访问已处置的对象。它发生在委托中,该委托在另一个线程的UI线程上设置Label的文本:
Private Sub SetWeightText_ThreadSafe(ByVal theLabel As Label, ByVal value As String)
If Not Me.IsDisposed AndAlso Not Me.Disposing Then
If theLabel.InvokeRequired Then
Dim theDelegate As New SetWeightText_Del(AddressOf SetWeightText_ThreadSafe)
'Exception here:
Me.Invoke(theDelegate, New Object() {theLabel, value})
Else
theLabel.Text = value
End If
End If
End Sub
异常发生在上面标记的行,其中调用了委托。当调试器在此处停止时,异常显示对象(Me
)已被释放,并且确定Me.Disposing
已成为真,显然有时在该初始if
语句之间,代表的调用。
例外是ObjectDisposedException was unhandled by user code
。我知道我可能只是将整个事情用空的处理程序包装在Try..Catch
中并完成它,但我宁愿完全阻止这个问题。
这发生每个时间。我该如何避免这种情况?