- ベストアンサー
C# マルチスレッドの例外処理方法
- C#マルチスレッドで例外処理を行う方法について解説します。
- デリゲートを利用してマルチスレッドを実行する際に、例外が発生してもプログラムが正常に終了してしまう問題があります。
- マルチスレッド内で例外を捕捉するためにはどうすれば良いのかについて考えてみましょう。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>#1の方 BeginInvokeは「非同期」の実行ですので、マルチスレッドになります。 で、非同期delegateでのマルチスレッドですが、どうも特殊みたいで、BeginInvoke中での例外を別スレッドでは受けられないようで、該当スレッド中で例外を受ける必要があるようです。 http://blog.livedoor.jp/gushwell/archives/23832333.html Threadクラス使えばこのような方法で問題無いみたいですが、当然引数、戻り値は使えませんから、例えばこんな手を使います。 http://www.atmarkit.co.jp/fdotnet/mthread/mthread02/mthread02_02.html
その他の回答 (2)
- terra5
- ベストアンサー率34% (574/1662)
>このようにした場合、Controlフォームのどこにtry-catchを入れればいいのでしょうか? 推測ですが、try catchでは受け取れないと思います。 多分、こういう手を使うのでは。 http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html
お礼
度重なる回答本当にどうもありがとうございます。
- milkoX
- ベストアンサー率33% (1/3)
とりあえずマルチスレッドの複数のスレッドというのが起こされたようには見えませんが。。。 単に、デリゲートのBeginInvokeメソッドを使って multiを呼び出しただけのように見えますが。。。 以下のコードのようなことをやりたいでしょうか? using System; using System.Threading; class Class1 { public static void Main() { (new Thread(new ThreadStart(multi))).Start(); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); try{ throw new Exception(); } catch{ Console.WriteLine("マルチスレッド実行中例外があがりました。"); } } }
お礼
回答ありがとうございます。 質問のプログラム例で、マルチスレッドになっているはずです。 (MainメソッドのThread.Sleep(500)を削除するとうまく動かないはずです) http://www.atmarkit.co.jp/fdotnet/mthread/mthread02/mthread02_01.html また、戻り値や引数を渡したいため、Threadクラスではなく、デリゲートを使いました。 もちろん、戻り値・引数が使えるのであれば、別にデリゲートにこだわりません。 (例示したプログラムは簡単化のために、あえて引数・戻り値のないvoid型としました)
お礼
回答どうもありがとうございます。 紹介して頂いたブログを参考に問題が解決しました。 ここからは、ただの疑問点(困ってはいません)なのですが、 紹介して頂いたブログによると、コールバックメソッドの方からControlフォームに向けて、非同期デリゲートで例外を新規に投げるといったものですよね。 このようにした場合、Controlフォームのどこにtry-catchを入れればいいのでしょうか? もしかしたらトンチンカンな質問かもしれませんが、気が向いたら回答頂ければ助かります。