SendAsync正在阻止UI线程

时间:2019-05-07 20:23:39

标签: c# http asynchronous sendasync

尝试将我的程序的一部分转换为异步http客户端调用。 拿出部分代码(在下面)进行测试。 基本上是一个具有非阻塞的异步按钮(据我所知)SendAsync()。它不应该阻止UI线程,对吗?由于目前无法看到的原因,它仍然会阻止它。

我花了最后两天的时间来找出问题所在。我实现了非阻塞文件写入日志记录和电子邮件发送功能,它们可以正常工作。

有人可以指出我在做什么错吗?

private async void button2_Click(object sender, EventArgs e)
    {
    NetworkCredential differentCredToPass = new NetworkCredential("user", "*****", "domain");
    WebProxy wcProxy = new WebProxy("1.1.1.1", 8080);
    wcProxy.UseDefaultCredentials = false;
    wcProxy.Credentials = differentCredToPass;
    var httpHandler = new HttpClientHandler();
    httpHandler.UseProxy = true;
    httpHandler.UseDefaultCredentials = false;
    httpHandler.Proxy = wcProxy;
    using(HttpClient httpClient = new HttpClient(httpHandler) )
        {
        try
            {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://cisco.Com");
            HttpResponseMessage response = await httpClient.SendAsync(request);
            textBox1.AppendText(response.StatusCode.ToString() + Environment.NewLine);
            }
        catch (Exception ex)
            {
            textBox1.AppendText(ex.Message.ToString() + Environment.NewLine);
            throw;
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

  

非阻塞(据我所知)SendAsync()

是的,是的,不是的。不幸的是,由于历史原因,SendAsync不是完全异步的。具体来说,它同步进行DNS查找和代理解析。因此,要使其完全无阻塞,您需要将该调用包装在Task.Run中:

HttpResponseMessage response = await Task.Run(() => httpClient.SendAsync(request));