2011-10-24 6 views
4

私は(CTRL-F5を - デバッガなしで実行)を使用して実行したときに私は次のような場合には1メッセージボックスを取得し、なぜ私は理解していないVS2010で:ThreadExceptionのための1つのAND ONLY 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

デザインによって。このイベントには、カスタムのアクセサを追加できます。デリゲートにハンドラを追加しないものは、それを置き換えます。ハンドラは1つしかなく、最後のハンドラが勝つ。 –

答えて

4

はぁ。どうやらそう。

dotPeekによると、ここApplication.ThreadExceptionためaddremoveハンドラのコードがあります:removeハンドラで、それは予想通り-=を使用しますが、addハンドラ内でどのように、

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; 
    } 
} 

お知らせ、それはちょうど=を使用しますか?あなたはそれが+=であるべきだと思うでしょうが、そうではないようです。

あなたは(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がハンドラを1つだけ許可することを意図していた場合、イベントは最悪の方法です。SetHandlerメソッドははるかに明確になります。 'remove' *が' - = 'を使うという事実を加え、この動作は予期せず、文書化されておらず、機能よりもはるかにバグのような臭いがあります。 –

関連する問題