컬렉션을 병렬로 처리하고 싶지만 구현하는 데 문제가있어서 도움이 필요합니다.
병렬 루프의 람다 내에서 C #에서 비동기로 표시된 메소드를 호출하려는 경우 문제가 발생합니다. 예를 들면 다음과 같습니다.
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
생성 된 모든 스레드가 사실상 백그라운드 스레드이고 Parallel.ForEach
호출이 완료를 기다리지 않기 때문에 카운트가 0 인 문제가 발생합니다 . async 키워드를 제거하면 메소드는 다음과 같습니다.
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
작동하지만 대기 영리를 완전히 비활성화하고 수동 예외 처리를 수행해야합니다. (간결하게 제거).
Parallel.ForEach
람다 내에서 await 키워드를 사용 하는 루프를 어떻게 구현할 수 있습니까? 가능합니까?
Parallel.ForEach 메서드의 프로토 타입은 Action<T>
매개 변수로 사용되지만 비동기 람다를 기다립니다.
의 가능한 중복 된 중첩은 Parallel.ForEach에서 기다리고
—
비탈리 Ulantikov에게
await
에서await GetData(item)
-는대로 컴파일 오류가 발생하는 것처럼 두 번째 코드 블록에.