Создание схемы отмены - PullRequest
1 голос
/ 25 марта 2009

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

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

Проблема состоит в том, чтобы выяснить, как отредактировать мой код, чтобы он проверял этот элемент и возвращался в GUI. Процесс синтаксического анализа идет несколькими методами.

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

Как лучше всего добавить этот запрос на отмену в мой код?

РЕДАКТИРОВАТЬ: Вот идея, вдохновленная ответом Джона Сондерса.

Что если в моем потоке обработки запустится фоновый поток, который ожидает изменения Cancel Singleton, а затем сгенерирует исключение из этого процесса? Кажется ли это хорошей практикой? Это не работает, как задумано

РЕДАКТИРОВАТЬ 2: Ответ Джона Сондерса кажется лучшим на данный момент. Я просто брошу свое собственное исключение, когда пока что синглтон верен. Я буду ждать, чтобы увидеть, если какие-либо другие решения предлагаются

Ответы [ 4 ]

2 голосов
/ 25 марта 2009

Thread.Abort - плохая идея, поскольку он прерывает поток в произвольной точке - возможно, прерывает его там, где вы меньше всего хотите, чтобы его прерывали.

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

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

0 голосов
/ 25 марта 2009

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

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

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

0 голосов
/ 25 марта 2009

Похоже, вы используете класс .NET backgroundworker. Я думаю, что вы можете передать параметр объекта в метод RunWorkerAsync, который затем станет доступен фоновому потоку в аргументе обработчика события DoWork.

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

0 голосов
/ 25 марта 2009

Вы можете использовать функцию Thread.Abort() в фоновом рабочем потоке. Это создает ThreadAbortException, который вы можете поймать любым из ваших методов, но который автоматически будет переброшен в конце блоков catch.

Также будут выполнены все finally -блоки.

...