我在这里有一个真正的难题,但首先需要一些背景知识。
我正在开发(在学习C#和.Net的同时)一个WPF应用程序
我一直在学习的方法是将每个组件(登录,get_log,process_log等)分别作为控制台应用程序编写,然后将它们全部集成到WPF框架中。
您可以想象,我能够使所有单个功能独立工作;但是当我将所有部分放在一起时,似乎应用程序无法通过初始连接-本质上是http://10.0.0.1/login.html?/main.html的GET。我逐步浏览了WPF版本,发现它进入了client.SendAsync()
调用,但从未退出过。 (HttpClient实例的超时设置为默认的100秒,而我等待的时间比这更长。)
在程序“挂起”时,应用程序的主窗口完全没有响应:最小化,最大化或关闭控件均无效。我什至不能拖动窗口,尽管我可以单击其他窗口,然后再次单击以重新获得焦点。
当我用Wireshark观看网络流量时,我看到我的应用程序发送GET请求,并且远程设备以200 OK和适当的HTML内容进行响应,但是此后没有其他内容。
我已经仔细检查了WPF版本和控制台版本(对于此特定部分)之间的代码,它们是相同的。
所以,我的问题是:
答案 0 :(得分:3)
以前有人看过这样的东西吗?
是
关于如何弄清楚发生了什么的任何建议?
请勿在异步方法上使用.Wait()
或.Result
。请改用await
。在控制台应用程序上,此“可能”没有问题,因为它没有同步上下文。但是在WPF应用程序上,如果它在UI线程上运行,几乎可以保证会陷入死锁。
如果您对更多细节感兴趣,Stephen Cleary对其blog
有了很好的解释答案 1 :(得分:0)
异步/等待解决阻止问题
private async void Button_Click(object sender, RoutedEventArgs e)
{
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("http://localhost");
HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, "users");
httpRequest.Content = new StringContent("{name:'admin'}");
var httpResponse = await httpClient.SendAsync(httpRequest);
//process http response
}
}