【发布时间】:2015-12-01 15:09:36
【问题描述】:
我有这个控制台应用程序,我的应用程序的一个 reduce 示例,但它允许重现行为。
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Start");
addAsync01(1, 2);
}
catch
{
}
finally
{
Console.WriteLine("Finally");
Console.ReadKey();
}
addAsync01(1,2);
}
private static async void addAsync01(int sum1, int sum2)
{
int result = await AddAsync(sum1, sum2);
Console.WriteLine("El resultado de sumar 1 y 2 es: " + result);
}
public static async Task<int> AddAsync(int num1, int num2)
{
return await Task<int>.Run(() =>
{
return num1 + num2;
});
}
}
在addSyn01方法中,我使用了await关键字,但是应用程序并没有等到AddAsync方法完成,继续运行,所以我在控制台中得到的结果是:
Start
Finally
El resultado de sumar 1 y 2 es: 3
我预料到了:
Start
El resultado de sumar 1 y 2 es: 3
Finally
如果我没记错的话,await 关键字等待async 方法完成继续下一行代码。
如果我在 AddAsync01 方法中使用此代码,它会按预期工作:
private static async void addAsync01(int sum1, int sum2)
{
Task<int> tskResult = AddAsync(1, 2);
await Task.WhenAll(tskResult);
Console.WriteLine("El resultado de sumar 1 y 2 es: " + tskResult.Result);
}
【问题讨论】:
-
你也需要
await addAsync01。 -
其实首先需要将
addAsync01重新定义为Task而不是void。async void通常不好,除了事件处理程序。 -
async void方法是一劳永逸的。你得到零关于他们的进展或结果的信息。所以不可能等待他们。不要使用async void方法。 -
@GlorinOakenfoot 你将无法等待
Main -
@Jonesopolis 是的。正如下面的答案所示,您必须使用 .Wait/Result 的恼人情况之一。
标签: c# async-await task-parallel-library