【问题标题】:SendAsync is blocking UI threadSendAsync 正在阻塞 UI 线程
【发布时间】:2019-05-07 20:23:39
【问题描述】:

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

我过去 2 天一直在试图找出问题所在。我实现了非阻塞文件写入日志记录和电子邮件发送功能,它们工作正常。

谁能指出我做错了什么?

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;
            }
        }
    }

【问题讨论】:

  • 看起来好像您在 UI 线程 (button2_Click) 上运行它,并且由于您向 UI 控件 (textBox1) 写入了一些内容,因此它必须阻塞,直到它收到回复。如果您希望它不阻塞 UI,请使用 BackgroundWorker 或以其他方式从另一个线程池中获取线程,并在回调中更新文本框。
  • 我将其移至单独的函数:public async Task<string> send_Request() 并使用 string a = await send_Request(); 从按钮调用它,还删除了所有对文本框的引用,它仍然阻塞。

标签: c# http asynchronous sendasync


【解决方案1】:

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

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

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

【讨论】:

  • 我回家后测试一下。谢谢斯蒂芬! Msdn 懒得提。
  • 值得注意的是,.NET Core 中的 SocketsHttpHandler 确实执行异步 DNS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多