Мое предположение: вы звоните downloadHandle.WaitOne()
из потока пользовательского интерфейса.Если вы выполняете код из обработчика событий пользовательского интерфейса (например, щелчок по кнопке или переход на новую страницу) или функции, вызываемой обработчиком событий, то вы в потоке пользовательского интерфейса.
Почему это проблема?
Конечно, DownloadAsync
выполняется в фоновом режиме, благодаря пулу потоков.Однако класс WebClient всегда выполняет свой обратный вызов (т. Е. Ваш client_DownloadStringCompleted
метод) с использованием потока пользовательского интерфейса ... Но этот же поток блокируется вашим downloadHandle.WaitOne()
!
. Поэтому, когда выЕсли тайм-аут заблокирован, метод client_DownloadStringCompleted
выполняется магическим образом.
Как это исправить?Два решения.
1 / Прекратить выполнение downloadHandle.WaitOne()
в главном потоке.Он блокирует пользовательский интерфейс, и ваше приложение перестает отвечать на запросы, что является никогда хорошей вещью.
2 / Используйте HttpWebRequest
вместо WebClient
.HttpWebRequest
выполняет обратный вызов в том же потоке, который начал загрузку, поэтому у вас не будет этой проблемы взаимоблокировки.