混淆异步并等待c#中的逻辑?

时间:2017-09-14 06:48:26

标签: c# asynchronous async-await

我在使用异步和等待时遇到了很大的困惑。

我的逻辑很简单,我有一个方法会导致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并且无法理解一件事

3 个答案:

答案 0 :(得分:4)

以下是实现此目标所需的步骤:

  1. 等待Task.Delay并返回num而不是Task

    public static async Task<int> delay(int num)
    {
        await Task.Delay(15000);
        return num;
    }
    
  2. delayAsync方法返回Task

    public static async Task delayAsync(int num)
    {
        Console.WriteLine(await delay(num) + "time :" + DateTime.Now);
    }
    
  3. 等待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线程串行处理中再次结束,只是投入了大量的精力来结束你的起点。