C# SendAsync正在阻止UI线程

C# SendAsync正在阻止UI线程,c#,http,asynchronous,sendasync,C#,Http,Asynchronous,Sendasync,正在尝试将程序的一部分转换为异步http客户端调用。 取出部分代码(如下)进行测试。 基本上是一个非阻塞的异步按钮(据我所知)sendaync()。它不应该阻塞UI线程,对吗?由于我目前看不到的原因,它仍然会阻止它 我花了两天的时间想弄清楚到底出了什么问题。我实现了非阻塞文件写入日志和电子邮件发送功能,它们工作正常 有人能指出我做错了什么吗 private async void button2_Click(object sender, EventArgs e) { Network

正在尝试将程序的一部分转换为异步http客户端调用。 取出部分代码(如下)进行测试。 基本上是一个非阻塞的异步按钮(据我所知)sendaync()。它不应该阻塞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;
            }
        }
    }
非阻塞(据我所知)SendAsync()

嗯,是的,也不是。不幸的是,出于历史原因,
sendascync
不是纯异步的。具体来说,它同步进行DNS查找和代理解析。因此,要使其完全非阻塞,您需要将该调用包装在
任务中。运行

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

似乎您正在UI线程上运行此操作(
button2\u单击
),并且由于您向UI控件(
textBox1
)写入了一些内容,因此它必须阻止,直到收到响应为止。如果希望它不阻塞UI,请使用
BackgroundWorker
或从另一个线程池获取线程,并在回调中更新文本框。我将其移动到单独的函数:
公共异步任务发送请求()
并使用
字符串a=wait send_Request()从按钮调用它,也删除了所有引用的文本框,它仍然会阻塞。我回家后会测试。谢谢斯蒂芬!Msdn并没有费心去提它。值得注意的是,.NETCore中的
SocketsHttpHandler
确实做了异步DNS。