例外処理のマルチスレッド
コンセプト
内部スローマルチスレッドの例外、現在のスレッドを終了します。しかし、他のスレッドには影響しません。一般的には仕事ではなく、唯一の例外情報を取得する必要がありますが必要になる場合もあり
別の概念スレッドがキャンセル含まれる他のスレッドを、知らせるために
一般的なアドバイス作業、例外を許可する層パックしないマルチスレッドの手数料:のtry-catchをして、操作を完了するために必要な異常情報を記録します。
例外をキャッチするためにシミュレートされたマルチスレッドコード例:
試す { 一覧 <タスク>タスクリスト= 新しいリスト<タスク> (); 以下のために(int型 i = 0 ; iは< 20 ; iは++ ) { 文字列名= $ " button1_Click_ {I} " 。 taskList.Add(Task.Run(() => { 場合(name.Equals(" button1_Click_1 " )) { スロー 新しい例外(" button1_Click_1异常を" )。 } 他の IF(name.Equals(" button1_Click_13 " )) { スロー 新しい新しい例外(" button1_Click_13例外は" ); } Console.WriteLineを($ " この成功は、{名} = {Thread.CurrentThread.ManagedThreadId.ToStringスレッドID IS(" 00 " )} " ); })); } Task.WaitAll(taskList.ToArray()); // 1スレッド例外を捕捉することができます } キャッチ(AggregateExceptionがある)// 2需要のtry-catch-AggregateException { foreachの(VARの例外でare.InnerExceptions) { Console.WriteLineを(exception.Message)。 } }
スレッドの取り消し:
マルチスレッドタスクは、失敗した後、停止している他のスレッドに通知することを希望すると、あなたは、スレッドの取り消しを使用することができます。タスク例外と現在のスレッドのスローの終わり、スレッドを終了Thread.Abort--。
OSのリソースに属するスレッドは、すぐに停止しないことがあります。タスクは、私たちだけで、それ自体を終了、外部のミッションを終了することはできません。
スレッドのキャンセル手順:
1 準備CancellationTokenSource 、 CancellationTokenSourceはありブールプロパティIsCancellationRequested 初期化がある偽
コールキャンセルMETHODSなっ真(戻すことはできません)、あなたは繰り返すことができますキャンセルスレッドをキャンセルします。
2のtry-catch(キャンセル)// この場合は、キャンセルを提供します真
3アクションは、任意の時点で決定するにはIsCancellationRequested
図4は、渡されたトークン、Runメソッドタスクのトークン//で入ってくるCancellationTokenSource あなたは、スレッドが開始されていない起動しない場合は、あなたが渡す必要がトークンを
#regionの例外を捕捉したスレッドのキャンセルはスレッドが起動しない起動しないのtry { CancellationTokenSource CTS = 新しい新しいCancellationTokenSourceを(); リスト <タスク> = TASKLIST 新しい新しいリスト<タスク> (); のため(int型 I = 0を、私は< 20をされます。 ++ I ) { 文字列名$ = " button1_Click_ {I} " ; taskList.Add(Task.Run(() => { 試み { IF(! cts.IsCancellationRequested) { Console.WriteLineを($ " これは、{名前}成功开始スレッドID = {Thread.CurrentThread.ManagedThreadId.ToString(" 00 " )} " ); } のThread.sleep(新しいランダム()次(。50、100 )); もし(name.Equals(" button1_Click_1 " )) { cts.Cancel()。 } それ以外の 場合((name.Equals" button1_Click_13 " )) { cts.Cancel()。 } もし(!cts.IsCancellationRequested) { Console.WriteLineを($ " これは{名前}成功结束スレッドID = {Thread.CurrentThread.ManagedThreadId.ToString(" 00 " )} " ); } 他 { Console.WriteLineを($ " 中途停止スレッドID = {Thread.CurrentThread.ManagedThreadId.ToString(これは、{名前です} " 00" )} " ); 戻り値; } } キャッチ(例外EX) { Console.WriteLineを(ex.Message); cts.Cancel(); } }、cts.Token)); } Task.WaitAll(taskList.ToArray() ); // 1スレッドの例外を捕捉することができる } キャッチ(AggregateExceptionである)// 2はAggregateExceptionキャッチトライ必要 { foreachのを(VARの例外でare.InnerExceptions) { Console.WriteLineを(exception.Message)。 } } #endregion