c# - SendAsync 正在阻塞 UI 线程
问题描述
试图将我的程序的一部分转换为异步 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;
}
}
}
解决方案
非阻塞(据我所知)SendAsync()
嗯,是的,也不是。不幸的是,由于历史原因,SendAsync
并不是纯粹的异步。具体来说,它同步进行 DNS 查找和代理解析。因此,要使其完全无阻塞,您需要将该调用包装在 a 中Task.Run
:
HttpResponseMessage response = await Task.Run(() => httpClient.SendAsync(request));
推荐阅读
- laravel - Laravel CORS 问题中的 XMLHttpRequest POST
- php - 如何将第二个字段名称放入 codeigniter 3 表单验证的大于规则
- vba - 在多个条件Word VBA中检索段落文本
- controller - QEMU:如何将 SD 卡连接到特定控制器?
- postgresql - PostgreSQL 数据库大小不等于所有表大小的总和
- python - SQLAlchemy create_engine 在谷歌云函数中不起作用
- ios - iOS 模拟器:获取相同页面截图 已编辑
- java - Java spark无法从spark sql中的本地文件系统加载文件
- ios - 如何访问科尔多瓦 WKWebview ios 应用程序的 iframe 中的元素?
- amazon-s3 - Kafka Streams Fault Tolerance with Offset Management in Parellel