这个问题在这里已有答案:
好的,所以我是初学者,并试图学习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");
}
你的程序不是在主方法中等待CallHttp()
。在GetAwaiter().GetResult
上使用.Wait()
或调用CallHttp
等待你的任务。它不会无限制地阻止你的程序,只会等到任务完成。