
下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。
しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。
(try-catchでも例外を捕捉できません)
マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか?
using System;
using System.Threading;
class Class1
{
delegate void delg();
public static void Main()
{
delg d = new delg(multi);
d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始
System.Threading.Thread.Sleep(500);
//マルチスレッドで例外を強制的に投げているので、
//ここまでたどり着く前にアプリケーションが落ちるはず。
//しかし、実際には正常終了。
Console.WriteLine("メインメソッド 正常終了");
}
public static void multi()
{
Console.WriteLine("マルチスレッドで実行中");
throw new Exception();//例外を強制的に投げる。
}
public static void call(IAsyncResult ar)
{
Console.WriteLine("コールバックメソッド実行");
}
}
No.2ベストアンサー
- 回答日時:
>#1の方
BeginInvokeは「非同期」の実行ですので、マルチスレッドになります。
で、非同期delegateでのマルチスレッドですが、どうも特殊みたいで、BeginInvoke中での例外を別スレッドでは受けられないようで、該当スレッド中で例外を受ける必要があるようです。
http://blog.livedoor.jp/gushwell/archives/238323 …
Threadクラス使えばこのような方法で問題無いみたいですが、当然引数、戻り値は使えませんから、例えばこんな手を使います。
http://www.atmarkit.co.jp/fdotnet/mthread/mthrea …
参考URL:http://blog.livedoor.jp/gushwell/archives/238323 …
回答どうもありがとうございます。
紹介して頂いたブログを参考に問題が解決しました。
ここからは、ただの疑問点(困ってはいません)なのですが、
紹介して頂いたブログによると、コールバックメソッドの方からControlフォームに向けて、非同期デリゲートで例外を新規に投げるといったものですよね。
このようにした場合、Controlフォームのどこにtry-catchを入れればいいのでしょうか?
もしかしたらトンチンカンな質問かもしれませんが、気が向いたら回答頂ければ助かります。
No.3
- 回答日時:
>このようにした場合、Controlフォームのどこにtry-catchを入れればいいのでしょうか?
推測ですが、try catchでは受け取れないと思います。
多分、こういう手を使うのでは。
http://www.atmarkit.co.jp/fdotnet/dotnettips/320 …
参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/320 …
No.1
- 回答日時:
とりあえずマルチスレッドの複数のスレッドというのが起こされたようには見えませんが。
。。単に、デリゲートの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/mthrea …
また、戻り値や引数を渡したいため、Threadクラスではなく、デリゲートを使いました。
もちろん、戻り値・引数が使えるのであれば、別にデリゲートにこだわりません。
(例示したプログラムは簡単化のために、あえて引数・戻り値のないvoid型としました)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java final 1 2022/06/10 22:49
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VBA Evaluate関数 型が一致しま...
-
Javaの例外 IllegalArgumentExc...
-
0除算の例外処理ができない!!...
-
全角スペースのチェックについて
-
Javaで文字列をゼロ埋め(ゼロパ...
-
C#の捕捉されない例外処理の対...
-
ブックマークレットについて
-
java 文字列の部分一致について
-
C# UriFormatExceptionの回避
-
VBA 400エラー 1004エラー
-
連続する「\\」をひとつの「\\...
-
タトゥーや墨を入れる人の共通点
-
時間の取得
-
【JSPがブラウザで表示されませ...
-
エクセルVBAで、条件に一致する...
-
C# インスタンスの破棄
-
クラスのプロパティに構造体を...
-
MFCで水平スクロールバー
-
エクセルVBA 画像を貼り付ける...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
C#の捕捉されない例外処理の対...
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
VC++におけるCStringの変換
-
VBA Evaluate関数 型が一致しま...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
ファイルダイアログを開いた時...
-
VB.NETで16進数が正しいかどう...
-
Timestamp型への変換について(J...
-
C# マルチスレッドにおける例外...
-
コンストラクタでの例外は不可...
-
文字列からダブルクオートの削除
-
String型の日付(2005/11/25)の...
-
例外ってIf文の中に入れますか...
-
初回例外
-
【JAVA】与えられた金額を貨幣...
-
アサーションと例外処理の違い...
-
VBA 400エラー 1004エラー
-
WebClient()以外でネットにアク...
おすすめ情報