C# 在异步/等待中,程序在等待完成之前执行
好的,我是初学者,正在尝试学习异步/等待的概念。现在我了解了Async Await的工作原理,并编写了以下代码: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
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");
}