Как я могу приостановить BackgroundWorker? Или что-то подобное

Я использовал a BackgroundWorker загружать некоторые веб-сайты путем вызова WebClient.DownloadString в цикле. Я хотел опцию для пользователя отменить посреди загрузки материала, таким образом, я звонил CancelAsync каждый раз, когда я нашел это CancellationPending шел посреди цикла.

Но теперь я заметил что функция DownloadString вид замораживаний иногда, таким образом, я решил использовать DownloadStringAsync вместо этого (вся эта внутренняя часть другой поток, созданный с BackgroundWorker). И так как я не хочу переписывать свой целый код при необходимости выйти из цикла и функции после вызова DownloadStringAsync, Я сделал некоторое время цикл прямо после вызова его, который действительно только проверяет на переменную bool Stop то, что я становлюсь верным также когда DownloadStringCompleted обработчик событий называют или когда пользовательский запрос для отмены операции.

Теперь, странная вещь состоит в том, что это хорошо работает на отладочной версии; но на выпуске один, программа замораживается в цикле с условием продолжения как то, если это был основной поток.

8
задан Alex 15 April 2015 в 20:19
поделиться

2 ответа

Мне кажется, вы заняты ожиданием с циклом while. Вместо этого вы должны использовать сигнализацию событий, например. WaitHandle. Цикл «занято-ожидание» в режиме выпуска вполне может поглотить весь ваш процессор, вызывая ощущение зависания.

Сообщать WaitHandle в DownloadStringCompleted или если пользователь отменяет загрузку.

Проверьте документы MSDN о классе WaitHandle. Там тоже есть пример.

4
ответ дан 6 December 2019 в 00:05
поделиться

Отправить цикл while, который проверяет отмену, на короткое время (несколько мс). Это хорошо освобождает время выполнения ЦП для других потоков и процессов.

0
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: