首页 > 解决方案 > 并行运行方法?

问题描述

下面的代码用于模拟耗时的工作。

async Task DoWork(string n)
{
    for (var i = 1; i <= 5; i++)
    {
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine($"{n} runs {i} seconds. {DateTime.Now}");
    }
}
async Task<int> F1()
{
    await DoWork("f1");
    return 1;
}
async Task<string> F2()
{
    await DoWork("f2");
    return "X";
}

以下代码将按顺序F1()运行。F2()

async Task<string> Main()
{
    var f1Task = F1();
    var f2Task = F2();
    var f1 = await f1Task;
    var f2 = await f2Task;
    return $"{f1} {f2}";
}
await Main();

下面的代码可以让它们并行运行。但是,它看起来很麻烦。

async Task<string> Main2()
{
    int f1 = 0;
    async Task G1() { f1 = await F1(); }
    string f2 = "";
    async Task G2() { f2 = await F2(); }

    await Task.WhenAll(Task.Run(() => G1()), Task.Run(() => G2()));
    return $"{f1} {f2}";
}

await Main2();

有没有办法在不包裹它们的情况下做到这一点Task.Run()

标签: c#asynchronous

解决方案


您可以使用WhenAll()方法让您的任务并行运行,例如

async Task<int> Main()
{
    var f1Task = F1();
    var f2Task = F2();
    await Task.WhenAll(f1Task,f2Task);
    return await f1Task + await f2Task;
}

推荐阅读