0

私は2つのスレッドを持っています。UserControl を持つ Thread-1 と、デリゲート メソッドを持つ Thread-2 です。スレッド 2 では、

i) Thread-1 でデリゲートを呼び出す必要があります。

ii)例外が発生したかどうかに応じて、いくつかの追加ロジックを実行します

これが私がやっていることです。Thread-1 では、コントロールを作成する前に、コールバックを登録しました

Application.ThreadException += MyUIExceptionHandler(); 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

質問 1: スレッド 2 では、呼び出し時に 例外の発生時にthread1Control.BeginInvoke(myDelegateMethod, args)コールバックを取得しますが、非同期であるため、上記の手順 ii) を実行する前に待機する時間がわかりません。への呼び出しの後の単純なものが私のために仕事をします。それは私が知っている方法で行われるべきです。しかし、これを達成するための他の選択肢は何ですか? PS:私はそのコードを制御できないため、UserControl 側から通知を行うことはできません!MyUIExceptionHandler()Control.BeginInvokeThread.Sleep(5000)BeginInvoke()

質問-2:同期呼び出し を使用する場合thread1Control.Invoke(myDelegateMethod, args)、請求書に完全に適合しているように見えますが、例外が発生した場合、 へのコールバックが取得されませんMyUIExceptionHandler()。この場合、コールバックを受け取らないのはなぜですか?

4

1 に答える 1

1

Control.BeginInvoke() は、ファイア アンド フォーゲット メソッドです。スレッドが別の場所に移動したため、もう実行されていない可能性があるため、ターゲットによって発生した例外はすべて UI スレッドで発生します。

Control.Invoke() は、完了まで待機するメソッドです。ターゲットの実行が完了するまで、ワーカー スレッドはブロックされます。結果に関心がある場合にのみこのメソッドを使用するため、ターゲットによって発生した例外はワーカー スレッドで再発生します。プログラムを実行し続けたい場合は、それをキャッチする必要があります。

于 2012-12-05T17:43:14.057 に答える