如何摆脱无法在C#中等待'void'

问题描述 投票:0回答:1

下面是我的示例应用程序看起来像如何浏览async/awaitTPL

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编译器处,编译错误为:

无法等待作废

我的查询是

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

如何摆脱这种情况?谢谢!

c# async-await task-parallel-library c#-6.0
1个回答
4
投票

首先,应将三个较小的任务声明为Task<string>而不是Task,否则在res中不会得到任何信息。当然,如果您不需要res中的任何内容,那不是问题。

这里更重要的问题是您应该使用WhenAll而不是WhenAll。前者返回WaitAllTask以便您等待,而后者只是等待任务完成(如果尚未完成)。由于您在此处Task<T[]>,因此应使用await

所以您的代码应该是:

WhenAll
© www.soinside.com 2019 - 2024. All rights reserved.