gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:11:56 27 4
gpt4 key购买 nike

下面是我的示例应用程序如何探索 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 编译器抛出构建错误为

cannot await void

我的问题是

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

如何摆脱这个?谢谢!

最佳答案

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

这里更重要的问题是你应该使用 WhenAll 而不是 WaitAll .前者返回 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.

关于c# - 如何在 C# 中摆脱 Cannot await 'void',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com