Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在异步/等待中,程序在等待完成之前执行_C#_.net_Asynchronous_Async Await - Fatal编程技术网

C# 在异步/等待中,程序在等待完成之前执行

C# 在异步/等待中,程序在等待完成之前执行,c#,.net,asynchronous,async-await,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 clien

好的,我是初学者,正在尝试学习异步/等待的概念。现在我了解了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 Wait时,我必须确保我的整个程序都在等待该等待完成

我可以使用类似于
Task.WaitAll()
的东西,但这不会再次使我的程序
保持/无响应。请引导我。在他们展示的任何例子中,我都没有看到任何文章告诉我们这个危险信号,为什么

编辑:


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

投反对票。。认真地简短回答:不,您还不了解async/await是如何工作的。您需要了解async void方法如何在C#7.1中工作async Main:“我可以使用类似Task.WaitAll()的东西”——当您想等待任务完成时,这听起来当然合理。“但这不会再次使我的程序保持/无响应”-我不明白你为什么会这样想。你试过了吗?你能描述一些可以观察到的问题吗?
 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");
        }