2011-10-24 32 views
4

我不明白爲什麼我當我運行使用(CTRL-F5 - 無調試器中運行)在以下情況下只拿到1消息框在VS2010:ThreadException是否只能有1個且只有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 
+0

這聽起來很奇怪。你會得到哪一個? –

+0

MsgBox說「SecondHandler」 – Denis

+2

按設計。該事件具有自定義添加訪問器。它不會將處理程序添加到委託中,它會替換它。只能有一個處理者,最後一個勝者。 –

回答

4

呵呵。顯然如此。

dotPeek,這裏是爲addremove處理程序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上撰寫此文章,請在此處張貼鏈接,以便其他人可以爲此投票。

+0

功能,而不是一個錯誤。當多個處理程序試圖報告/處理異常時,什麼都不會發生。 –

+0

...特別是因爲[內存泄漏可能發生](http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception%28v=VS.100%29.aspx)與這是一個靜態事件(如果在應用程序結束時未分離)。 –

+3

@HansPassant,是的,多個處理程序*可能會遇到麻煩。但是如果MS打算只允許一個處理程序,事件是最糟糕的方式 - SetHandler方法會更清晰。添加'remove' *會使用' - ='的事實,並且這種行爲是意想不到的,並且沒有記錄,並且它更像是一個bug而不是特性。 –

相關問題