使用async/await执行并行任务

6

我需要在Silverlight中执行多个异步任务。

第三方软件包的文档说明我可以使用

await Task.WhenAll()

不幸的是,Silverlight只有Task.WaitAll(),而且它不能等待。如果我尝试使用它,我会遇到死锁(我认为-因为整个事情都会冻结)。

在异步方法中使用的正确模式是什么?


应该反过来。WaitAll 应该从 Silverlight API 中排除,而 WhenAll 应该包含在内。您是否安装了正确版本的 .NET? - Servy
就我所知,在我的标准SL5上,我只看到了Task.WaitAll;没有Task.WhenAll。我猜除非我安装第三方库,不然是看不到的。 - Peter Tirrell
2个回答

11

对于Silverlight,我假设您正在使用Microsoft.Bcl.Async包。

由于此(附加)包无法修改(内置的)Task类型,在TaskEx类型中可以找到一些有用的方法。包括WhenAll

await TaskEx.WhenAll(...);

1

如果我理解你的问题正确的话,我认为你可以尝试使用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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接