Вопрос

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

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

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

Это было полезно?

Решение

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

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

Проверить MSDN Docs. на классе Waithandle. Там тоже есть пример.

Другие советы

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

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

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

И у меня есть пауза кнопки, что, когда я нажимаю на него, PausWorker (глобальная переменная или свойство) становится правдой и петлями в первую очередь, только без увеличения Icounter, и когда я делаю PausWorker = False снова, процесс продолжается

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top