等待不等待任务完成

时间:2018-05-02 21:33:08

标签: c#

我有控制台应用程序并执行获取流,这需要很长时间。我添加Wait()等待,但由于某些原因它不等待并立即关闭控制台应用程序。从我的udnerstanding Wait()应该阻止,直到任务完成。任何人都可以解释为什么它不会发生。 P.S我的网址获取流至少需要10秒,因此现在它的速度非常快。

 class Program
   {
       static void Main(string[] args)
       {
       new Runner().Run().Wait();
       }
   }

   public class Runner
   {      
       public async Task Run()
       {
          var hc = new HttpClient();
          await hc.GetStreamAsync("whateverURLwhichtakeslongtime");
       }
    }  

2 个答案:

答案 0 :(得分:1)

当我测试它时,代码似乎很好。

class Program
{
    static void Main(string[] args)
    {
        System.Diagnostics.Debug.WriteLine("1");
        new Runner().Run().Wait();
        System.Diagnostics.Debug.WriteLine("4");
    }
}

public class Runner
{
    public async Task Run()
    {
        var hc = new HttpClient();
        System.Diagnostics.Debug.WriteLine("2");
        var result = await hc.GetStringAsync("http://www.google.com");
        System.Diagnostics.Debug.WriteLine(result);
        System.Diagnostics.Debug.WriteLine("3");
    }
}

输出:

1
2
<!doctype html>......some long google page response
3
4

所以它实际上工作正常。

现在如果不清楚,请尝试使用Thread.Sleep(5000)//睡眠5秒钟 主要是肯定在等待

class Program
{
    static void Main(string[] args)
    {
        System.Diagnostics.Debug.WriteLine("1");
        new Runner().Run().Wait();
        System.Diagnostics.Debug.WriteLine("4");
    }
}

public class Runner
{
    public async Task Run()
    {
        var hc = new HttpClient();
        System.Diagnostics.Debug.WriteLine("2");
        Thread.Sleep(5000);
        System.Diagnostics.Debug.WriteLine("3");
    }
}

输出:

1
2
...waiting 5 seconds
3
4

答案 1 :(得分:1)

最终,当你在一项不完整的任务上致电.Wait()(或.Result)时,所有投注都会被取消;这根本不是一个定义明确的场景。幸运的是,最近的C#版本包括async对入口点的支持,所以:使用它!

   static async Task Main(string[] args)
   {
       await new Runner().Run();
   }

在这种情况下, 也可以简化为:

   static Task Main(string[] args)
   {
       return new Runner().Run();
   }