C # фоновый рабочий

У меня есть задача, выполняемая в фоновом режиме. при нажатии кнопки запуска пользователь запускает процесс и получает одну кнопку отмены, чтобы отменить обработку.

Когда пользователь нажимает «Отмена», я хотел бы показать окно сообщения, что «Процесс не был завершен, вы хотите продолжить».

Здесь я хочу, чтобы обработка оставалась только после ввода пользователя. До этого момента нужно остановить нить заднего заземления. Может ли кто-нибудь помочь мне в этом. Есть ли способ остановить фонового рабочего на некоторое время. Любая помощь будет принята с благодарностью.


person Anees    schedule 18.07.2010    source источник


Ответы (2)


Не встроено. Вы можете указать своему коду (на каждой [n] итерации цикла и т. Д.) Проверять что-то вроде ManualResetEvent, чтобы увидеть, должен ли он продолжать работать (в то же время он проверяет отмену). Я не рекомендую приостанавливать поток (Thread.Suspend), поскольку вы не знаете, какие блокировки и т. Д. Он может удерживать в данный момент.

С другой стороны ... почему бы не дать ему поработать, пока вы не узнаете, что его нужно отменить? Затем вам просто нужно проверять отмену (для этого есть флаг) каждые [n] итераций ...

person Marc Gravell    schedule 18.07.2010
comment
Возможно, обработка требует интенсивного использования ЦП, и программист хочет временно вернуть ресурсы пользователю, пока он принимает свое решение. - person Jonathan Allen; 18.07.2010
comment
Или фоновый процесс делает что-то необратимое (удаление файлов и т. Д.), Которое должно быть прервано быстро, если запущено случайно. - person Heinzi; 18.07.2010

Если BackgroundWorker работает с объектом, который виден обоим потокам, вы можете «заблокировать» этот объект, ожидая ответа пользователя на вопрос в диалоговом окне. Это приведет к остановке рабочего потока до тех пор, пока поток, генерирующий диалог, не завершит блокировку.

person Assaf    schedule 18.07.2010
comment
Это заблокирует рабочий процесс только в том случае, если рабочий поток постоянно пытается получить блокировку и снимает ее. И это может привести к блокировке пользовательского интерфейса, если работающий не его каждый раз выпускает. - person Marc Gravell; 18.07.2010
comment
Верно, это будет зависеть от того, как рабочий использует объект (когда / если блокировка получена / снята). Но новый «фиктивный» общий объект может быть использован, если ни один из существующих объектов не обрабатывается в соответствии с условиями, указанными выше (в сообщении и комментарии). - person Assaf; 18.07.2010