如何在 C# 中摆脱 Cannot await 'void'

How to get rid of Cannot await 'void' in C#

下面是我的示例应用程序如何探索 async/await & TPL

class Program
{
    static async void Main(string[] args)
    {

        Console.WriteLine("Order for breakfast");
        Breakfast obj = new Breakfast();
        Task t1 = Task.Run(() => obj.MakeTea());
        Task t2 = Task.Run(() => obj.ToastBread());
        Task t3 = Task.Run(() => obj.BoilEgg());
        Console.WriteLine("Breakfast ready");
        var res = await Task.WaitAll(t1, t2, t3); // LOE - throwing error
    }
}

class Breakfast
{
    //making a tea
    public string MakeTea()
    {
        return "tea";

    }

    //toasting bread
    public string ToastBread()
    {
        return "bread";
    }

    //boil eggs
    public string BoilEgg()
    {
        return "egg";
    }
}

#LOE 编译器抛出构建错误

cannot await void

我的查询是

  1. 我没有像 void 一样的方法,为什么会抛出这样的错误?
  2. 为什么 void 不能等待?

如何摆脱这个? 谢谢!

首先,你应该将三个较小的任务声明为Task<string>而不是Task,否则你将不会在res中得到任何东西。当然,如果你不需要 res.

中的任何东西,那不是问题

这里更重要的问题是你应该使用WhenAll而不是WaitAll。前者 returns 一个 TaskTask<T[]> 供您等待,而后者只是等待任务完成(如果尚未完成)。由于您 await 在这里,您应该使用 WhenAll.

所以你的代码应该是:

Task<string> t1 = Task.Run(() => obj.MakeTea());
Task<string> t2 = Task.Run(() => obj.ToastBread());
Task<string> t3 = Task.Run(() => obj.BoilEgg());
Console.WriteLine("Breakfast ready");
var res = await Task.WhenAll(t1, t2, t3);

// res will contain tea, bread and egg, in some order.