我在使用异步和等待时遇到了很大的困惑。
我的逻辑很简单,我有一个方法会导致15秒的延迟,就像这个
public static Task<int> delay(int num)
{
Task.Delay(15000);
return Task.FromResult(num);
}
现在我正在调用这个方法
public static async void delayAsync(int num)
{
Console.WriteLine(await delay(num)+"time :"+DateTime.Now);
}
static void Main(string[] args)
{
var details = new details();
Console.WriteLine("## start ##");
for (var i = 0; i < 5; i++)
{
Console.WriteLine("counter: "+i);
delayAsync(i);
}
Console.WriteLine("## finished ##");
Console.Read();
}
我想要的输出是在延迟15秒之后逐个获得数字,但是我得到的结果一下子没有任何停顿。我错过了什么。
我已经完成了这个blog并且无法理解一件事
答案 0 :(得分:4)
以下是实现此目标所需的步骤:
等待Task.Delay
并返回num
而不是Task
。
public static async Task<int> delay(int num)
{
await Task.Delay(15000);
return num;
}
让delayAsync
方法返回Task
。
public static async Task delayAsync(int num)
{
Console.WriteLine(await delay(num) + "time :" + DateTime.Now);
}
等待delayAsync
方法Main
的结果。
public static void Main(string[] args)
{
Console.WriteLine("## start ##");
for (var i = 0; i < 5; i++)
{
Console.WriteLine("counter: " + i);
delayAsync(i).Wait();
}
Console.WriteLine("## finished ##");
Console.Read();
}
答案 1 :(得分:2)
您没有等待Task.Delay
public static async Task<int> delay(int num){
await Task.Delay(15000);
return num;
}
请注意,该方法的签名需要包含async
。此外,由于您现在在方法中使用await
,因此您不需要为return语句显式创建任务。
此外,您必须等待Main方法中的delayAsync调用(请注意,您无法进行主异步,因此您必须使用如下的解决方法:https://stackoverflow.com/a/9212343/868361
答案 2 :(得分:1)
我想要的输出是在延迟15秒后逐个获得数字
当您调用async方法而不是await
时,编译器将启动它并继续执行其余的过程。在你的情况下与循环的其余部分。因此,获得所需输出的简单解决方案将在此处:
不要使用async
方法!只需将其作为连续处理即可。
要使用async
实现所需功能,您必须在循环中等待delayAsync
方法。但是这会使异步处理同步,你会在正常的1线程串行处理中再次结束,只是投入了大量的精力来结束你的起点。