異なるスレッドでスローされた例外をキャッチする
マルチスレッド プログラミングでは、スレッド以外のスレッドで発生する例外を処理することが困難な場合があります。メインスレッド。この問題は、1 つのメソッド (Method1) が新しいスレッドを生成し、そのスレッドが例外をスローする別のメソッド (Method2) を実行する場合に発生します。問題は、Method1 内でこの例外をどのようにキャプチャするかです。
.NET 4 以降のソリューション
.NET 4 以降のバージョンの場合、Task
タスク スレッドでの例外の処理:
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); task.Start(); Console.ReadLine(); } static int Test() { throw new Exception(); } static void ExceptionHandler(Task<int> task) { var exception = task.Exception; Console.WriteLine(exception); } }
タスク スレッドでの例外の処理発信者スレッド:
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.Start(); try { task.Wait(); } catch (AggregateException ex) { Console.WriteLine(ex); } Console.ReadLine(); } static int Test() { throw new Exception(); } }
どちらの場合も、AggregateException が発生しますが、実際の例外には ex.InnerExceptions を通じてアクセスできます。
解決策.NET 3.5 の場合
.NET の場合3.5 では、次のアプローチを使用できます:
子スレッドでの例外の処理:
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler)); thread.Start(); Console.ReadLine(); } private static void Handler(Exception exception) { Console.WriteLine(exception); } private static void SafeExecute(Action test, Action<Exception> handler) { try { test.Invoke(); } catch (Exception ex) { Handler(ex); } } static void Test(int a, int b) { throw new Exception(); } }
呼び出し元での例外の処理スレッド:
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception)); thread.Start(); thread.Join(); Console.WriteLine(exception); Console.ReadLine(); } private static void SafeExecute(Action test, out Exception exception) { exception = null; try { test.Invoke(); } catch (Exception ex) { exception = ex; } } static void Test(int a, int b) { throw new Exception(); } }
これらのオプションは、マルチスレッド シナリオで例外を処理する際の柔軟性を提供し、アプリケーションでの堅牢なエラー管理を保証します。
以上がC# のさまざまなスレッドでスローされた例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。