程序在Async / Await中的等待完成之前执行

时间:2018-09-02 22:54:19

标签: c# .net asynchronous 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即可停止工作,唯一有效的解释是我的程序在我的等待处理之前完成了执行。

疑问:但是我看不到任何文章都提到这个细节,这不是真正的疑问吗?我在这里想念一些概念吗?因此,每当我应用Async等待时,都必须确保整个程序都在等待该等待完成吗?

我可以使用类似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 个答案:

答案 0 :(得分:1)

您的程序未在您的Main方法中等待CallHttp()。通过使用GetAwaiter().GetResult或在.Wait()上调用CallHttp来等待任务。它不会无限阻塞您的程序,只会等待任务完成。