为什么异步方法不会立即返回等待?

Wey*_*ani 4 c# async-await

我以为这是一个合理的模式,用于在事件处理程序中异步调用WebClient DownloadData:

private async void button1_Click(object sender, EventArgs e)
{
    WebClient wc = new WebClient();
    //wc.Proxy = null;
    byte[] bytes = await wc.DownloadDataTaskAsync("http://www.google.com");
    label1.Text = Encoding.ASCII.GetString(bytes);
}
Run Code Online (Sandbox Code Playgroud)

但是在返回之前我发现DownloadDataTaskAsync块大约5秒钟(除非取消注释wc.Proxy = null语句).如果一个方法可以随心所欲地执行非平凡的工作甚至在返回任务之前,那么这个方法有什么意义呢?

大概这意味着安全我不应该像上面那样调用xAsync方法,而应该始终将它们包装在Task.Run()中以确保.或不?

Ste*_*ary 7

这是WebClient/的一个已知问题HttpWebRequest:代理和DNS查找始终是同步完成的.这是一个错误,但微软已经决定不出于向后兼容性原因而修复它.

我建议的第一件事是使用HttpClient.如果这不起作用并且您需要异步,那么您可以将调用包装起来Task.Run.

  • 桌面.NET的`HttpClient`在一个线程池请求中包装了`HttpWebRequest`,因此(在撰写本文时)它使用一种暴力来强制DNS /代理内容异步.不理想,但它的工作原理.而且我不确定`HttpClient`是否在其他平台上做(或必须做)这个. (3认同)