HttpClient.SendAsync, ПО-видимому, сбой или блокировка?

#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. Кто-нибудь видел что-нибудь подобное раньше?
  2. Любые предложения о том, как я мог бы разобраться, что происходит?

Комментарии:

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