以下代码正常工作(在控制台上打印标记):
System.Net.WebClient wc = new System.Net.WebClient(); var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au"); Console.WriteLine(task1.Result); // works
但是,当我等待任务时,它只是等待永远,任务的状态是WaitingForActivation:
System.Net.WebClient wc = new System.Net.WebClient(); var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au"); Console.WriteLine(await task1); Console.WriteLine("done!"); // this never gets printed
我错过了什么?
编辑:完整代码:
static void Main(string[] args) { DoIt(); } static async void DoIt() { System.Net.WebClient wc = new System.Net.WebClient(); var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au"); Console.WriteLine(await task1); Console.WriteLine("done!"); // this never gets printed }
Yuval Itzcha.. 5
我错过了什么?
目前,您调用代码的方式,我认为无法完成任务WaitingForActivation
.一旦DoIt
命中第一个await
,它就会将控制权交还给调用者,这是你的Main
方法,它应该终止并关闭你的控制台.
使用Task.Result
是因为它同步阻止异步方法,因此它等待它完成,你看到结果打印到控制台.
你真正需要做的是DoIt
async Task
代替async void
,并Task.Wait
在那里使用同步阻止,所以Main
不会终止:
static void Main(string[] args) { DoItAsync().Wait(); } static async Task DoItAsync() { System.Net.WebClient wc = new System.Net.WebClient(); var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au"); Console.WriteLine(await task1); Console.WriteLine("done!"); // this never gets printed }
注意使用Task.Result
和Task.Wait
仅用于使控制台不终止.在任何其他环境(UI基于或ASP.NET),你不应该永远阻塞异步代码,应始终await
对异步方法.
我错过了什么?
目前,您调用代码的方式,我认为无法完成任务WaitingForActivation
.一旦DoIt
命中第一个await
,它就会将控制权交还给调用者,这是你的Main
方法,它应该终止并关闭你的控制台.
使用Task.Result
是因为它同步阻止异步方法,因此它等待它完成,你看到结果打印到控制台.
你真正需要做的是DoIt
async Task
代替async void
,并Task.Wait
在那里使用同步阻止,所以Main
不会终止:
static void Main(string[] args) { DoItAsync().Wait(); } static async Task DoItAsync() { System.Net.WebClient wc = new System.Net.WebClient(); var task1 = wc.DownloadStringTaskAsync("https://www.google.com.au"); Console.WriteLine(await task1); Console.WriteLine("done!"); // this never gets printed }
注意使用Task.Result
和Task.Wait
仅用于使控制台不终止.在任何其他环境(UI基于或ASP.NET),你不应该永远阻塞异步代码,应始终await
对异步方法.