.net中ThreadException是否只能由一个且仅一个处理程序捕获?
- 内容介绍
- 文章标签
- 相关推荐
本文共计567个文字,预计阅读时间需要3分钟。
我无法直接修改您提供的代码片段,因为它包含了一些无法识别的特殊字符和格式。但我可以尝试帮助您理解并简化这段代码的大致含义。
代码片段似乎是从一个Visual Basic应用程序中提取的,其中包含了一个窗体(Form1)的加载事件处理程序。以下是对代码的简化解释:
我不明白为什么在VS2010中运行(使用快捷键Ctrl-F5,即运行而不使用调试器)时,我只得到一个消息框:公共类Form1私有子程序Form1_Load参数sender为System.Object参数e为System.EventArgs处理MyBase.Load' Ad
简化后的描述:- 在VS2010中,使用特定快捷键运行程序时,程序只显示一个消息框。- 消息框内容可能包含一个类的定义和其加载事件的代码。
请注意,这段代码并未提供足够的信息来完全理解程序的行为或问题所在。如果您能提供更多的上下文或具体的错误信息,我可以提供更详细的帮助。
我不明白为什么在VS2010中运行(CTRL-F5 – Run Without Debugger)时,我在以下情况下只得到1个Message Box: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,这是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实际上是替换现有的处理程序而不是添加它.
看起来像一个简单明了的bug.如果您在Connect上写这个,请在此处发布链接,以便其他人可以投票.
本文共计567个文字,预计阅读时间需要3分钟。
我无法直接修改您提供的代码片段,因为它包含了一些无法识别的特殊字符和格式。但我可以尝试帮助您理解并简化这段代码的大致含义。
代码片段似乎是从一个Visual Basic应用程序中提取的,其中包含了一个窗体(Form1)的加载事件处理程序。以下是对代码的简化解释:
我不明白为什么在VS2010中运行(使用快捷键Ctrl-F5,即运行而不使用调试器)时,我只得到一个消息框:公共类Form1私有子程序Form1_Load参数sender为System.Object参数e为System.EventArgs处理MyBase.Load' Ad
简化后的描述:- 在VS2010中,使用特定快捷键运行程序时,程序只显示一个消息框。- 消息框内容可能包含一个类的定义和其加载事件的代码。
请注意,这段代码并未提供足够的信息来完全理解程序的行为或问题所在。如果您能提供更多的上下文或具体的错误信息,我可以提供更详细的帮助。
我不明白为什么在VS2010中运行(CTRL-F5 – Run Without Debugger)时,我在以下情况下只得到1个Message Box: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,这是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实际上是替换现有的处理程序而不是添加它.
看起来像一个简单明了的bug.如果您在Connect上写这个,请在此处发布链接,以便其他人可以投票.

