2013-03-13 5 views
6

Ich muss mehrere asynchrone Aufgaben in Silverlight ausführen.Ausführen von parallelen Aufgaben mit async/erwarten

Dokumentation der 3rd-Party-Paket Staaten kann ich

await Task.WhenAll() 

Leider nur Task.WaitAll() haben Silverlight verwenden und es ist nicht awaitable. Wenn ich versuche, es zu benutzen, bekomme ich Deadlock (ich nehme an - weil das Ganze einfriert)

Was ist das richtige Muster, um in async Methode zu verwenden?

+0

Das sollte anders herum sein. Es ist 'WaitAll', das von der silverlight API ausgeschlossen werden sollte und WhenAll sollte enthalten sein. Haben Sie die richtige Version von .NET installiert? – Servy

+0

FWIW, auf meinem Lager SL5 Ich sehe nur 'Task.WaitAll'; Es gibt keine "Task.WhenAll", ich nehme an, es sei denn, ich installiere eine 3rd-Party-Bibliothek. –

Antwort

10

Für Silverlight gehe ich davon aus Sie das Microsoft.Bcl.Async Paket verwenden.

Da dieses (Add-On-) Paket den (eingebauten) Task-Typ nicht ändern kann, finden Sie einige nützliche Methoden im TaskEx-Typ. Einschließlich WhenAll:

await TaskEx.WhenAll(...); 
1

Ich denke, dass Sie versuchen könnten, TaskFactory.ContinueWhenAll zu verwenden, um ähnliches Verhalten zu haben, wenn ich Ihre Frage richtig verstehe. 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); 
    } 
});