4

タスクの配列を待機させようとしているときに、私が "try"ブロックの中でどのように使うべきかを理解したいと思います。タスクの配列の例外をキャッチする方法

例外が投げられた場合でも、すべてのタスクが完了するように、すべてのタスクが待たれるようにします。

私が使用する必要があります。また

var tasks = new Task<CasApiRouterModelExtendedInfo>[mbis.Length]; 

for (int i = 0; i < mbis.Length; i++) 
{ 
    tasks[i] = CAS.Service.GetAllRouterInterfacesAsync(mbis[i], false, 2); 
} 

try 
{ 
    Task.WaitAll(tasks); 
} 
catch (AggregateException ex) 
{ 
    Trace.TraceError("Some interface discoveries failed: "); 
    foreach (var innerEx in ex.InnerExceptions) 
    { 
     Trace.TraceError(innerEx.Message); 
    } 
} 
foreach (var task in tasks) 
{ 
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null) 
    { 
     returnResults.Add(task.Result); 
    } 
} 

OR

var tasks = new Task<CasApiRouterModelExtendedInfo>[mbis.Length]; 

for (int i = 0; i < mbis.Length; i++) 
{ 
    tasks[i] = Task.Run(() => CAS.Service.GetAllRouterInterfacesAsync(mbis[i], true, 2)); 
} 

try 
{ 
    for (int i = 0; i < tasks.Length; i++) 
    { 
     tasks[i].Wait(); 
    } 
} 
catch (AggregateException ex) 
{ 
    Trace.TraceError("Some interface discoveries failed: "); 
    foreach (var innerEx in ex.InnerExceptions) 
    { 
     Trace.TraceError(innerEx.Message); 
    } 
} 

foreach (var task in tasks) 
{ 
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null) 
    { 
     returnResults.Add(task.Result); 
    } 
} 

は、 "task.Status == TaskStatus.RanToCompletionは" 限りタスクは例外をスローしていなかったとしてtrueを返すことを行います(これはこのチェックを行う良い方法ですか?)

答えて

2

Bを好む理由はありますか?私は1つ考えることができません。

Bエラーの場合は正しくありません。

また、悪いスタイルです。あなたの意図は、すべてのタスクを待つことです、そのコードで言いなさい。あなたが達成したいものを不明瞭にするマニュアルループは必要ありません。

また、タスクが例外をスローしなかった場合、「task.Status == TaskStatus.RanToCompletion」はtrueを返します(これはこのチェックを行う良い方法です)。

正常終了を確認します。おそらく、これはあなたが望むものです。タスクはキャンセルされる可能性がありますが、エラーケースとみなされる可能性があります。

task.Result != null 

これは本当に必要なものですか? task.Resultは、システムによってnullに設定されることはありません。これは、GetAllRouterInterfacesAsyncの結果がnullの場合にのみ発生します。

+0

はい、GetAllRouterInterfacesAsync()は実際にはNULL結果を返すことができるので、これは本当に必要なものです。 私が心配していたのは、「Task.WaitAll(tasks)」は、単一のタスクがExceptionを投げた場合に、すべてのタスクが完了できないかどうかです。これが当てはまるかどうか知っていますか、例外をスローするかどうかに関係なくすべてのタスクが完了します。 – blgrnboy

+1

タスクが完了するのを防ぐことはできません。そのようなAPIは存在しません。 WaitAllは、エラーが発生したかどうかに関係なく、すべてのタスクが完了するまで待機します。タスクコンビネータAPIのどれもタスクを変更しません。 – usr

関連する問題