如何在 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
我的查询是
- 我没有像 void 一样的方法,为什么会抛出这样的错误?
- 为什么 void 不能等待?
如何摆脱这个?
谢谢!
首先,你应该将三个较小的任务声明为Task<string>
而不是Task
,否则你将不会在res
中得到任何东西。当然,如果你不需要 res
.
中的任何东西,那不是问题
这里更重要的问题是你应该使用WhenAll
而不是WaitAll
。前者 returns 一个 Task
或 Task<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.
下面是我的示例应用程序如何探索 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
我的查询是
- 我没有像 void 一样的方法,为什么会抛出这样的错误?
- 为什么 void 不能等待?
如何摆脱这个? 谢谢!
首先,你应该将三个较小的任务声明为Task<string>
而不是Task
,否则你将不会在res
中得到任何东西。当然,如果你不需要 res
.
这里更重要的问题是你应该使用WhenAll
而不是WaitAll
。前者 returns 一个 Task
或 Task<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.