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

Kgn*_*web 0 c# task-parallel-library async-await c#-6.0

下面是我的示例应用程序如何探索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";
    }
}
Run Code Online (Sandbox Code Playgroud)

在#LOE 编译器抛出构建错误作为

不能等待无效

我的查询是

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

如何摆脱这个?谢谢!

Swe*_*per 8

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

这里更重要的问题是你应该使用WhenAll而不是WaitAll. 前者返回 aTaskTask<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.
Run Code Online (Sandbox Code Playgroud)