程序在等待完成之前执行Async / Await [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

好的,所以我是初学者,并试图学习Async / Await概念。现在我现在了解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);
   }

好的,这段代码工作正常,但是一旦我删除了Thread.SLeep它就会停止工作,只有有效的解释是我的程序在我的await处理之前完成执行。

怀疑:但我没有看到任何文章中提到的这个细节,这不是一个真正的怀疑吗?我在这里错过了一些概念吗?因此,每当我申请Async等待时,我必须确保我的整个程序等待等待完成?

我可以使用类似Task.WaitAll()的东西,但不会再次使我的程序Hold/Non Responsive。请指导我。在他们展示的任何一个例子中我都没有看到任何文章告诉这个RED FLAG,为什么会这样?

编辑:

 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");
        }
c# .net asynchronous async-await
1个回答
1
投票

你的程序不是在主方法中等待CallHttp()。在GetAwaiter().GetResult上使用.Wait()或调用CallHttp等待你的任务。它不会无限制地阻止你的程序,只会等到任务完成。

© www.soinside.com 2019 - 2024. All rights reserved.