C# 如何摆脱迫不及待的';无效';在C中#

C# 如何摆脱迫不及待的';无效';在C中#,c#,async-await,task-parallel-library,c#-6.0,C#,Async Await,Task Parallel Library,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()); Tas

下面是我的示例应用程序如何探索
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";
    }
}
at#LOE编译器将生成错误作为

不能等待空虚

我的问题是

  • 我没有像void那样的方法,为什么它会抛出这样的错误
  • 为什么空虚不能等待
  • 如何摆脱这个?
    谢谢

    首先,您应该将三个较小的任务声明为
    Task
    ,而不是
    Task
    ,否则您将无法在
    res
    中获得任何内容。当然,如果您不需要
    res
    中的任何内容,这也不是问题

    这里更重要的问题是您应该使用而不是
    WaitAll
    。前者返回一个
    任务
    任务
    ,供您等待,而后者仅等待任务完成(如果任务尚未完成)。由于您在这里等待,因此应在所有时使用

    因此,您的代码应该是:

    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.
    
    taskt1=Task.Run(()=>obj.MakeTea());
    Task t2=Task.Run(()=>obj.ToastBread());
    Task t3=Task.Run(()=>obj.BoilEgg());
    控制台。WriteLine(“早餐准备就绪”);
    var res=等待任务时(t1、t2、t3);
    //res将按一定顺序包含茶、面包和鸡蛋。
    
    将Main方法的返回类型从
    static async void Main(string[]args)
    更改为
    static async
    Task
    Main(string[]args)
    @Dennis1679,只需检查相同的错误它的Task即可await@Dennis1679这是完全错误的。我提到它只是为了防止OP得到错误的信息。您只能等待一个任务或实现可等待模式的东西。Void不会返回任何东西,因此没有什么可以等待。你描述的死锁是另一回事。@Crowcoder你完全正确。我现在看到了我写的错误。我把两种不同的东西混在一起了。谢谢你通知我。为了纠正我之前的评论:我想警告OP使用async void作为返回类型,然后从其中调用异步任务。因为在某些情况下,如果异步void中的任务失败,则无法从中恢复。你的申请已经失效了,是的。正确,谢谢!但是想知道在什么情况下我应该使用.WaitAll()@kgnweb来同步等待它们。这就像调用每个任务一样。@Kgn-web如果你能帮助它,就永远不要:)@GabrielLuci,你是什么意思?@Kgn-web如果可能的话,你应该这样做,而且几乎总是这样。使用
    wait Task.wheall
    总是比使用
    Task.WaitAll
    好。