2013-03-13 3 views
6

Silverlight에서 여러 개의 비동기 작업을 실행해야합니다. 제 3 자 패키지 상태의async/await를 사용하여 병렬 작업 실행

문서는 난 단지 Task.WaitAll()

await Task.WhenAll() 

불행하게도 실버를 사용할 수 있으며 awaitable 없습니다. 만약 내가 그것을 사용하려고하면 나는 교착 상태가된다. (모든 것이 얼어 버리기 때문에)

비동기 메소드에서 사용할 적절한 패턴은 무엇인가?

+0

그 반대의 경우가 있습니다. Silverlight API에서 제외되어야하는 'WaitAll'이며 WhenAll이 포함되어야합니다. 적절한 버전의 .NET이 설치되어 있습니까? – Servy

+0

FWIW, 내 주식 SL5에서 나는 단지'Task.WaitAll'을 본다; 어떤 타사 라이브러리를 설치하지 않는 한'Task.WhenAll'이 없습니다. –

답변

10

난 당신이 Microsoft.Bcl.Async 패키지를 사용하는 가정합니다.

이 (추가 기능) 패키지는 (내장형) Task 유형을 수정할 수 없으므로 TaskEx 유형의 유용한 메소드를 찾을 수 있습니다. WhenAll :

await TaskEx.WhenAll(...); 
1

질문을 올바르게 이해하면 TaskFactory.ContinueWhenAll을 사용하여 유사한 문제가 발생할 수 있다고 생각합니다. Example는 :

실버 라이트에 대한
var task1 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(1000); 
    return "dummy value 1"; 
}); 

var task2 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(2000); 
    return "dummy value 2"; 
}); 

var task3 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value 3"; 
}); 

Task.Factory.ContinueWhenAll(new[] { task1, task2, task3 }, tasks => 
{ 
    foreach (Task<string> task in tasks) 
    { 
     Console.WriteLine(task.Result); 
    } 
});