#c# #wpf
#c# #wpf
Вопрос:
Здесь у меня настоящая головоломка, но сначала немного предыстории.
Я разрабатываю (во время изучения C # и .Net) приложение WPF, которое
- использует HttpClient для подключения к части сетевого оборудования
- загружает файл журнала в формате .csv (после входа в систему)
- массирует записи журнала и представляет их в виде сетки
Способ, которому я научился, заключается в написании каждого компонента (login, get_log, process_log и т.д.) По отдельности в виде консольных приложений, А затем объединении их всех в рамках WPF framework.
Как вы можете себе представить, я смог заставить все отдельные функции работать независимо; но когда я собираю все части вместе, кажется, что приложение не может пройти начальное соединение — по сути, ПОЛУЧЕНИЕhttp://10.0.0.1/login.html?/main.html . Я просмотрел версию WPF и обнаружил, что она вошла в client.SendAsync()
вызов, но так и не вышла обратно. (Время ожидания экземпляра HttpClient установлено по умолчанию на 100 секунд, и я ждал НАМНОГО дольше этого.)
Пока программа «зависает», главное окно приложения полностью не отвечает: ни один из элементов управления сворачиванием, разворачиванием или закрытием не работает. Я даже не могу перетащить окно, хотя я могу щелкнуть по другим окнам и щелкнуть по нему снова, чтобы восстановить фокус.
Когда я просматриваю сетевой трафик с помощью Wireshark, я вижу, что мое приложение отправляет запрос GET, а удаленное устройство отвечает 200 OK и соответствующим HTML-контентом, но больше ничего после этого.
Я дважды и трижды проверял код между версией WPF и консольной версией (для этого конкретного раздела), и они идентичны.
Итак, мои вопросы:
- Кто-нибудь видел что-нибудь подобное раньше?
- Любые предложения о том, как я мог бы разобраться, что происходит?
Комментарии:
1. Я думаю, я знаю, почему я проголосовал против. В свою защиту я действительно не знал, что это проблема с блокировкой, поэтому, возможно, искал неправильные решения. Документация для HttpClient. SendAsync сообщает «Эта операция не будет заблокирована»!
Ответ №1:
Кто-нибудь видел что-нибудь подобное раньше?
ДА
Любые предложения о том, как я мог бы разобраться, что происходит?
Никогда не используйте метод асинхронности .Wait()
or .Result
on. Используйте await
вместо этого. В консольном приложении это «может» не быть проблемой, поскольку у него нет контекста синхронизации. Однако в приложении WPF вы почти гарантированно столкнетесь с тупиковой ситуацией, если это будет запущено в потоке пользовательского интерфейса.
Если вас интересуют более подробные сведения, Стивен Клири получил отличное объяснение в своем блоге
Ответ №2:
Асинхронность / ожидание решения проблемы блокировки
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
}
}