C # Как я могу отправить перерыв в другой подпрограмме? - PullRequest
8 голосов
/ 28 октября 2008

У меня работает цикл, который будет обрабатывать 1000 записей, в настоящее время, когда цикл запущен, его нельзя остановить, и пользователь должен дождаться его завершения. Как я могу остановить цикл, когда кто-то нажимает кнопку «Отмена»? Как мне ворваться в эту другую рутину?

Спасибо

Ответы [ 6 ]

13 голосов
/ 28 октября 2008

Вы можете просто использовать компонент BackgroundWorker .

Он основан на событиях и очень прост в использовании. Выглядит очень подходящим для того, что вы описываете.

Имеет хорошую поддержку сигналов отмены , а также отчетов о ходе выполнения .

И множество примеров кода вы можете найти в Google.


Установите свойство WorkerSupportsCancellation , чтобы оно было истинным.

backgroundworker1.WorkerSupportsCancellation = true;

Сделайте это перед тем, как запустить рабочего.

Затем в цикле вы можете опросить свойство CancellationPending :

if (backgroundWorker1.CancellationPending) return;

Просто пример, но вы должны понять.

13 голосов
/ 28 октября 2008

Вы можете запустить его в своем собственном потоке и прервать его. Просто помните, что это может привести к плохой работе.

Вместо этого вы должны создать флаг выхода, который поток проверяет в безопасных точках. Если он отмечен как выходной, поток остановится, как только это будет безопасно.

1 голос
/ 28 октября 2008

спасибо за ответы. Это backgroundworker, но когда я использую backgroundworker1.cancelAsync();, я получаю исключение:

"Этот BackgroundWorker заявляет, что не поддерживает отмену. Измените WorkerSupportsCancellation, чтобы заявить, что он поддерживает отмена "

Как мне изменить это? Это наследственный код, извините!

0 голосов
/ 28 октября 2008

Установите для свойства WorkerSupportsCancellation в BackgroundWorker значение true: -)

Вы также должны проверить свойство CancellationPending внутри цикла, чтобы увидеть, следует ли прерывать обработку. В статье MSDN, на которую ссылается чакрит, есть хороший блок примера кода

Edit: D'Oh, вы меня на несколько секунд там chakrit:)

0 голосов
/ 28 октября 2008

Вы можете добавить кнопку отмены, которая устанавливает логический флаг

Внутри цикла добавьте «Application.DoEvents» в ключевые моменты, а затем проверьте логический флаг. Если флаг был отключен, выполните предварительную очистку и выйдите из цикла.

0 голосов
/ 28 октября 2008

Как сказал Марк, вам нужно реализовать какую-то кооперативную синхронизацию. Люди часто тяготеют к желанию использовать Thread.Abort здесь ... но это плохая идея.

Есть ряд вопросов, которые касаются этого, например, смотрите: " Есть ли хороший способ в C # для создания исключения в данном потоке. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...