HttpClient.SendAsync是否显然崩溃或阻止?

时间:2019-04-03 21:11:28

标签: c# wpf

我在这里有一个真正的难题,但首先需要一些背景知识。

我正在开发(在学习C#和.Net的同时)一个WPF应用程序

  • 使用HttpClient连接到一台网络设备
  • (登录后)以.csv格式下载日志文件
  • 按摩日志条目并将其显示在GridView中

我一直在学习的方法是将每个组件(登录,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版本和控制台版本(对于此特定部分)之间的代码,它们是相同的。

所以,我的问题是:

  1. 以前有没有人看过这样的东西?
  2. 关于如何弄清楚发生了什么的任何建议?

2 个答案:

答案 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
        }
    }