使用async/await执行并行任务

本文关键字:执行 并行任务 await async 使用 | 更新日期: 2023-09-27 18:03:32

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

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

await Task.WhenAll()

不幸的是silverlight只有Task.WaitAll(),它是不可等待的。如果我尝试使用它,我得到死锁(我假设-因为整个东西冻结)

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

使用async/await执行并行任务

对于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);
    }
});