[英]HttpClient.SendAsync APPARENTLY crashing or blocking?
我在這里有一個真正的難題,但首先要有一些背景知識。
我正在開發(在學習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版本和控制台版本(對於此特定部分)之間的代碼,它們是相同的。
因此,我的問題是:
有人看過這樣的東西嗎?
是
關於如何確定發生了什么的任何建議?
切勿在異步方法上使用.Wait()
或.Result
。 請改用await
。 在控制台應用程序上,此“可能”沒有問題,因為它沒有同步上下文。 但是在WPF應用程序上,如果它在UI線程上運行,幾乎可以保證會陷入死鎖。
如果您對更多細節感興趣,Stephen Cleary在他的博客中得到了很好的解釋。
異步/等待解決阻塞問題
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.