HttpClient PostAsync被阻止

时间:2019-06-25 02:03:21

标签: c# async-await dotnet-httpclient

我正在尝试从我的UI线程调用HttpClient.PostAsync()。我已经在开发机器上对此进行了测试,并且工作正常,但是在目标机器上似乎阻塞了UI线程。我在两台机器上都运行了该测试

int tick = Environment.TickCount;
Task<HttpResponseMessage> postTask =  _httpClient.PostAsync(Uri, new StringContent(messageString));
MessageBox.Show(String.Format("Time {0}", Environment.TickCount - tick));
response = await postTask;

在我的开发计算机上,消息框显示〜<100ms,但是在目标计算机上,该消息框超过2.5秒。我缺少什么东西吗?还是需要一些设置/操作系统/硬件支持?

2 个答案:

答案 0 :(得分:1)

这可能与DNS查找有关,并且注释中指出,如果您确实需要阻止UI,则注释可能会缓存以供将来调用。

唯一的解决方案是卸载(以牺牲线程池线程为代价)。

var postTask = await Task.Run(() => _httpClient.PostAsync(Uri, new StringContent(messageString)));

答案 1 :(得分:0)

我想找到了解决方案,以供将来参考。好像在ServicePointManager.FindServicePoint()中花费了时间,这被称为创建WebRequest。我注意到使用适当的网关配置目标计算机可以解决速度问题,但是在我的情况下,该计算机不会始终连接到较大的LAN或Internet,因此我想出了是否将HttpClientHandler.UseProxies设置为false它跳过尝试查找代理服务器的过程,现在返回的时间约为32毫秒。

奇怪的是他们没有FindServicePoint() async,但这似乎是问题所在。我以为Uri是固定IP,即http://192.168.250.1:80/...,我会绕过所有这些东西,但情况并非如此