スレッドNesting await in Parallel.ForEachには、複数の(MaxDegreeOfParallelism)非同期タスクを並列で実行するためにTask.WhenAllを使用するように提案された回答があり、前のタスクが完了するまで待機しません。タスクパラメータを含める方法タスクの配列例外処理で
public static Task ForEachAsync<T>(
this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current).ContinueWith(t =>
{
//observe exceptions
});
}));
}
と体がパラメータを持っている場合、私はexceptions.e.gを処理するときに、パラメータ値を知りたい
ids.ForEachAsync(10, async id =>
{
ICustomerRepo repo = new CustomerRepo();
var cust = await repo.GetCustomer(id);
customers.Add(cust);
});
のようにそれを呼び出します。 idのためにタスク本体が失敗した場合、特定のIDに対して起こったことを指定して、例外を記録する必要があります。
私は Accessing values in Task.ContinueWithを見ましたが、t.IsFaultedのときにパラメータにアクセスできませんでした。 (ブロックせず、すなわち非同期)
は最後に、私はラムダ本体の内側のtry/catchを追加したのだが、私はわからないがids.ForEachAsync(10, async id =>
{
try
{
ICustomerRepo repo = new CustomerRepo();
var cust = await repo.GetCustomer(id);
customers.Add(cust);
}
catch(Exception e)
{
_logger.LogError(e,” id=“+ id);
}
});
は、それが正常に動作しない動作するようです。
体を待って、その後継続(ContinueWith(トン=> {...})内の電流を使用する前に、VAR電流= partition.Currentを使用するには、元の答えsuggestedの後半著者 - 。
ことができます誰も優れているアプローチ、確認の各アプローチのいずれも短所try
/catch
でawait
ラッピング