Как я могу сделать паузу фонара? Или что-то подобное
-
26-09-2019 - |
Вопрос
Я использовал 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 снова, процесс продолжается