我需要在Silverlight中执行多个异步任务。
第三方软件包的文档说明我可以使用
await Task.WhenAll()
不幸的是,Silverlight只有Task.WaitAll()
,而且它不能等待。如果我尝试使用它,我会遇到死锁(我认为-因为整个事情都会冻结)。
在异步方法中使用的正确模式是什么?
我需要在Silverlight中执行多个异步任务。
第三方软件包的文档说明我可以使用
await Task.WhenAll()
不幸的是,Silverlight只有Task.WaitAll()
,而且它不能等待。如果我尝试使用它,我会遇到死锁(我认为-因为整个事情都会冻结)。
在异步方法中使用的正确模式是什么?
对于Silverlight,我假设您正在使用Microsoft.Bcl.Async包。
由于此(附加)包无法修改(内置的)Task
类型,在TaskEx
类型中可以找到一些有用的方法。包括WhenAll
:
await TaskEx.WhenAll(...);
如果我理解你的问题正确的话,我认为你可以尝试使用TaskFactory.ContinueWhenAll来获得类似的行为。示例:
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);
}
});
WaitAll
应该从 Silverlight API 中排除,而WhenAll
应该包含在内。您是否安装了正确版本的 .NET? - ServyTask.WaitAll
;没有Task.WhenAll
。我猜除非我安装第三方库,不然是看不到的。 - Peter Tirrell