タスクの配列を待機させようとしているときに、私が "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を返すことを行います(これはこのチェックを行う良い方法ですか?)
はい、GetAllRouterInterfacesAsync()は実際にはNULL結果を返すことができるので、これは本当に必要なものです。 私が心配していたのは、「Task.WaitAll(tasks)」は、単一のタスクがExceptionを投げた場合に、すべてのタスクが完了できないかどうかです。これが当てはまるかどうか知っていますか、例外をスローするかどうかに関係なくすべてのタスクが完了します。 – blgrnboy
タスクが完了するのを防ぐことはできません。そのようなAPIは存在しません。 WaitAllは、エラーが発生したかどうかに関係なく、すべてのタスクが完了するまで待機します。タスクコンビネータAPIのどれもタスクを変更しません。 – usr