代码之家  ›  专栏  ›  技术社区  ›  Unbreakable

在Async/await[duplicate]中,程序在await完成之前执行

  •  -1
  • Unbreakable  · 技术社区  · 7 年前

    好的,我是初学者,正在尝试学习异步/等待概念。现在我了解了Async Await的工作原理,并编写了以下代码:

    static void Main(string[] args)
    {
       string createText = "Hello and Welcome" + Environment.NewLine;
       CallHttp();
       Thread.Sleep(1000);
    }
    
    static public async void CallHttp()
    {
         var client = new HttpClient();
         client.BaseAddress = new Uri("https://api.crowdin.com/");
         HttpResponseMessage response = await client.GetAsync("URL");
         using (Stream stream = await response.Content.ReadAsStreamAsync())
         using (FileStream fs = new FileStream(@"SomeLoc\test.zip", FileMode.Create))
          await stream.CopyToAsync(fs);
       }
    

    好的,这段代码可以正常工作,但是一旦我删除线程。睡眠它停止工作,唯一有效的解释是我的程序在等待被处理之前完成了执行。

    疑问:但是我没有看到任何一篇文章提到这个细节,这不是一个真正的疑问吗?我是不是漏掉了什么概念?所以,每当我应用Async await时,我必须确保我的整个程序都在等待这个await完成?

    我可以用这样的东西 Task.WaitAll() Hold/Non Responsive . 请引导我。我没有看到任何一篇文章在他们展示的任何例子中提到这个危险信号,为什么?

    编辑:

     static void Main(string[] args)
            {
                var task = CallHttp();
            }
            static public async Task CallHttp()
            {
                var client = new HttpClient();
                client.BaseAddress = new Uri("https://api.crowdin.com/");
                HttpResponseMessage response = await client.GetAsync("URL");
                using (Stream stream = await response.Content.ReadAsStreamAsync())
                using (FileStream fs = new FileStream(@"\test.zip", FileMode.Create))
                    await stream.CopyToAsync(fs);
                System.IO.Compression.ZipFile.ExtractToDirectory(@"\alpha\test.zip", @"\beta");
            }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Mehdi Ibrahim    7 年前

    CallHttp() GetAwaiter().GetResult .Wait() CallHttp . 它不会无限地阻止你的程序,只会等到任务完成。