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

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

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

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

Ответы [ 3 ]

4 голосов
/ 12 июня 2010

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

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

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

0 голосов
/ 18 января 2012

хорошая тема, я использовал В моем фоновом рабочем процессе двойное время

 int icounter = 1;
 while (icounter < SomeListInventory.Count)
            {
                while (pauseWorker == false)
                { 
                    //-----------------------
                    //DO SOME WORK
                        icounter++;
                    //-----------------------
                }
            }

И у меня есть кнопка паузы, когда я нажимаю ее, pauseWorker (глобальная переменная или свойство) становится истинным и зацикливается только в первый раз, без увеличения icounter, и когда я снова делаю pauseworker = false, процесс продолжается

0 голосов
/ 12 июня 2010

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

...