2013-03-13 93 views
6

我需要在Silverlight中執行多個異步任務。使用async/await執行並行任務

第三方包狀態的文檔,我可以使用

await Task.WhenAll() 

不幸的Silverlight只有Task.WaitAll(),它不是awaitable。如果我嘗試使用它,我會陷入僵局(我認爲 - 因爲整個事情會死機)

什麼是在async方法中使用的正確模式?

+0

這應該是相反的。它的'WaitAll'應該被排除在Silverlight API和WhenAll應該包括在內。你是否安裝了正確版本的.NET? – Servy 2013-03-13 03:58:14

+0

FWIW,在我的股票SL5上我只看到'Task.WaitAll';除非我安裝了一些第三方庫,否則我沒有任何'Task.WhenAll'。 – 2016-06-10 15:47:50

回答

10

爲Silverlight我假設你正在使用的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); 
    } 
});