我不明白为什么在 VS2010 中使用 (CTRL-F5 - Run without Debugger) 在以下情况下只得到 1 个消息框:
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' Add the event handler for handling UI thread exceptions to the event.
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler2
Throw New Exception("Ha!")
End Sub
Private Sub ThreadExceptionHandler(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
MsgBox("FirstHandler")
End Sub
Private Sub ThreadExceptionHandler2(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
MsgBox("SecondHandler")
End Sub
End Class
最佳答案
呵呵。显然如此。
根据 dotPeek , 这是 add
的代码和 remove
Application.ThreadException 的处理程序:
public static event ThreadExceptionEventHandler ThreadException
{
add
{
System.Windows.Forms.IntSecurity.AffectThreadBehavior.Demand();
Application.ThreadContext threadContext =
Application.ThreadContext.FromCurrent();
lock (threadContext)
threadContext.threadExceptionHandler = value;
}
remove
{
Application.ThreadContext threadContext =
Application.ThreadContext.FromCurrent();
lock (threadContext)
threadContext.threadExceptionHandler -= value;
}
}
注意如何,在
remove
中处理程序,它使用 -=
正如预期的那样,但在 add
处理程序,它只使用 =
?你会认为应该是 +=
,但看起来并非如此。所以是的,当您使用
+=
时操作符来添加一个新的事件处理程序(转换为对 add
处理程序的调用),WinForms 实际上是替换现有的处理程序而不是添加到它。看起来像一个错误,简单明了。如果你把它写在 Connect ,在此处发布链接,以便其他人可以为其投票。
关于.net - ThreadException 只能有 1 个且只有 1 个处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881204/