我正在尝试从我的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秒。我缺少什么东西吗?还是需要一些设置/操作系统/硬件支持?
答案 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/...
,我会绕过所有这些东西,但情况并非如此