2013-03-13 32 views
6

Muszę wykonać wiele zadań asynchronicznych w Silverlight.Wykonaj zadania równoległe z async/await

Dokumentacja 3rd stanach paczka party mogę używać

await Task.WhenAll() 

Niestety Silverlight tylko Task.WaitAll() i nie jest awaitable. Jeśli spróbuję go użyć, dostaję impasu (zakładam - ponieważ wszystko się zawiesza)

Jaki jest właściwy wzór do zastosowania w metodzie asynchronicznej?

+0

To powinno być odwrotnie. To 'WaitAll', które powinno być wyłączone z interfejsu API silverlight i kiedy wszystko powinno być włączone. Czy masz zainstalowaną odpowiednią wersję .NET? – Servy

+0

FWIW, na moim magazynie SL5 Widzę tylko 'Task.WaitAll'; nie ma 'Task.WhenAll' zakładam, chyba że zainstaluję bibliotekę 3rd party. –

Odpowiedz

10

dla Silverlight Zakładam, że używasz pakietu Microsoft.Bcl.Async.

Ponieważ ten (dodatek) pakiet nie może modyfikować (wbudowany) typu Task, znajdziesz kilka przydatnych metod w typie TaskEx. W tym WhenAll:

await TaskEx.WhenAll(...); 
1

Myślę, że możesz spróbować użyć funkcji TaskFactory.ContinueWhenAll, aby zachować podobne zachowanie, jeśli poprawnie zrozumiem Twoje pytanie. 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); 
    } 
});