Я использовал a BackgroundWorker
загружать некоторые веб-сайты путем вызова WebClient.DownloadString
в цикле. Я хотел опцию для пользователя отменить посреди загрузки материала, таким образом, я звонил CancelAsync
каждый раз, когда я нашел это CancellationPending
шел посреди цикла.
Но теперь я заметил что функция DownloadString
вид замораживаний иногда, таким образом, я решил использовать DownloadStringAsync
вместо этого (вся эта внутренняя часть другой поток, созданный с BackgroundWorker
). И так как я не хочу переписывать свой целый код при необходимости выйти из цикла и функции после вызова DownloadStringAsync
, Я сделал некоторое время цикл прямо после вызова его, который действительно только проверяет на переменную bool Stop
то, что я становлюсь верным также когда DownloadStringCompleted
обработчик событий называют или когда пользовательский запрос для отмены операции.
Теперь, странная вещь состоит в том, что это хорошо работает на отладочной версии; но на выпуске один, программа замораживается в цикле с условием продолжения как то, если это был основной поток.
Мне кажется, вы заняты ожиданием с циклом while. Вместо этого вы должны использовать сигнализацию событий, например. WaitHandle. Цикл «занято-ожидание» в режиме выпуска вполне может поглотить весь ваш процессор, вызывая ощущение зависания.
Сообщать WaitHandle в DownloadStringCompleted или если пользователь отменяет загрузку.
Проверьте документы MSDN о классе WaitHandle. Там тоже есть пример.
Отправить цикл while, который проверяет отмену, на короткое время (несколько мс). Это хорошо освобождает время выполнения ЦП для других потоков и процессов.