일반적인 Task.WaitAll이 있습니까?
다음과 같이 몇 가지 병렬 작업을 시작합니다.
var tasks =
Enumerable.Range(1, 500)
.Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue))
.ToArray();
그리고 그들과 함께
Task.WaitAll(tasks);
이 마지막 줄 tasks
에서 경고 메시지와 함께 파란색 구불 구불 한 표시가 나타납니다.
Task []에서 Task []로 공변 배열 변환 쓰기 작업에서 런타임 예외가 발생할 수 있습니다.
이 메시지가 표시되는 이유를 이해합니다.하지만 해결 방법이 있습니까? (예 : 일반 버전 Task.WaitAll()
?)
경고가 있어도 안전한 작업이라고 확신하지만, 자신 만의 구현을 만드는 것보다 더 나은 옵션은 tasks
매개 변수를 원하는 유형으로 변환하는 것입니다 .
Task.WaitAll(tasks.Cast<Task>().ToArray())
그것은 나를 위해 푸른 물결 모양을 죽이고, 내 tasks
변수를 제네릭으로 유지하고 궁극적으로 불필요한 완전히 새로운 무서운 코드를 만들도록 강요하지 않습니다.
Task.WaitAll의 일반적인 메서드는 모든 작업이 매우 제한된 유용성을 나타내는 동일한 유형을 반환해야 함을 의미합니다. 그런 식으로 작성하는 것은 수동으로 할 수 있지만 (Bas Brekelmans 답변 참조) 많은 작업없이 ContinueWith 또는 취소를 허용하지 않습니다.
다른 용도로 배열을 사용하지 않는 경우 간단한 해결책은 다음과 같습니다.
.ToArray<Task>();
이를 위해 확장 메서드를 만들 수 있습니다.
WaitAll의 정확한 구현은 모르지만 모든 항목이 완료 될 때까지 대기한다고 가정 할 수 있습니다.
static class TaskExtensions
{
public static void WaitAll<T>(this Task<T>[] tasks)
{
foreach (var item in tasks)
{
item.Wait();
}
}
}
그런 다음 현재 코드에서 다음을 호출하십시오.
tasks.WaitAll();
편집하다
실제 구현은 조금 더 복잡합니다. 상당히 길기 때문에이 답변에서 코드를 생략했습니다.
일반 작업을 지원하도록 수정할 수 있습니다.
더 쉽고 간단한 답변
사실이 IS 유사한 일반적인 과부하 :
Task all = Task.WhenAll(tasks)
이것은 Task
모든 작업이 완료된 후 완료 될를 반환한다는 점 에서 다릅니다 . 그래서 당신은 await
그것에 또는 Wait()
원하는대로 사용할 수 있습니다 .
서명을보십시오 :
과부하
--------- 비 일반적인 과부하 --------------
WhenAll(IEnumerable<Task>)
Task
열거 가능한 컬렉션의 모든 개체 가 완료되면 완료 될 작업을 만듭니다 .
WhenAll(Task[])
Task
배열 의 모든 개체 가 완료되면 완료 될 작업을 만듭니다 .--------- 일반 과부하 --------------
WhenAll<TResult>(IEnumerable<Task<TResult>>)
Task<TResult>
열거 가능한 컬렉션의 모든 개체 가 완료되면 완료 될 작업을 만듭니다 .
WhenAll<TResult>(Task<TResult>[])
Task<TResult>
배열 의 모든 개체 가 완료되면 완료 될 작업을 만듭니다 .
참고 URL : https://stackoverflow.com/questions/10044099/is-there-a-generic-task-waitall
'program story' 카테고리의 다른 글
유효한 Java입니까? (0) | 2020.12.09 |
---|---|
클래스 템플릿 파라미터로서의 Lambda 표현식 (0) | 2020.12.09 |
AnkhSVN 대 VisualSVN (0) | 2020.12.09 |
"null"참조 (즉, 구독자가없는 이벤트)에 대한 확장 메서드를 호출하는 것이 악한가요? (0) | 2020.12.09 |
"라틴"에서 지원하는 언어와 Google 웹 글꼴의 글꼴에서 "라틴 확장"글리프? (0) | 2020.12.09 |