等待多个具有不同结果的任务

396

我有三个任务:

private async Task<Cat> FeedCat() {}
private async Task<House> SellHouse() {}
private async Task<Tesla> BuyCar() {}

在我的代码继续之前,它们都需要运行,并且我也需要每个任务的结果。这些结果彼此没有任何共同点。

我该如何调用和等待这3个任务完成,然后获取结果?


38
您有任何订购要求吗?也就是说,您是否希望在喂完猫之后再出售房屋? - Eric Lippert
12个回答

-1
var dn = await Task.WhenAll<dynamic>(FeedCat(),SellHouse(),BuyCar());

如果你想访问猫,你需要这样做:

var ct = (Cat)dn[0];

这很简单,非常有用,没有必要去寻找复杂的解决方案。


9
这里只有一个问题:dynamic 是个麻烦的家伙。它主要用于处理复杂的 COM 互操作等情况,不应在不必要的情况下使用。特别是如果你关心性能、类型安全、重构或调试的话。 - Joel Mueller

-3

await语句不是使代码按顺序运行吗?考虑以下代码

class Program
{
    static Stopwatch _stopwatch = new();

    static async Task Main(string[] args)
    {
        Console.WriteLine($"fire hot");
        _stopwatch.Start();
        var carTask = BuyCar();
        var catTask = FeedCat();
        var houseTask = SellHouse();
        await carTask;
        await catTask;
        await houseTask;
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} done!");

        Console.WriteLine($"using await");
        _stopwatch.Restart();
        await BuyCar();
        await FeedCat();
        await SellHouse();            

        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} done!");
    }

    static async Task BuyCar()
    {
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} buy car started");
        await Task.Delay(2000);
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} buy car done");
    }

    static async Task FeedCat()
    {
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} feed cat started");
        await Task.Delay(1000);
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} feed cat done");
    }

    static async Task SellHouse()
    {
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} sell house started");
        await Task.Delay(10);
        Console.WriteLine($"{_stopwatch.ElapsedMilliseconds} sell house done");
    }
}

fire hot
0 buy car started
3 feed cat started
4 sell house started
18 sell house done
1004 feed cat done
2013 buy car done
2014 done!
using await
0 buy car started
2012 buy car done
2012 feed cat started
3018 feed cat done
3018 sell house started
3033 sell house done
3034 done!

我相信使用这些等待,它将同步运行,这可能不是你想要的。 - Ben Power

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