好的,所以我是初学者,正在尝试学习异步/等待概念。现在,我现在了解了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");
}
答案 0 :(得分:1)
您的程序未在您的Main方法中等待CallHttp()
。通过使用GetAwaiter().GetResult
或在.Wait()
上调用CallHttp
来等待任务。它不会无限阻塞您的程序,只会等待任务完成。