Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как правильно закрывать форму во время Invoke


Автор: nyxiscoo1 4.2.2009, 11:57
Доброго времени суток, уважаемые форумчане. Нужен ваш совет.
Есть приложение, которое в запускает несколько операций в отдельных потоках и слушает эвенты этих операций, при этом есть форма, которая отображает прогресс и прочую статистику выполнения операций на основе данных полученных с помощию событий.
Данные полученные от событий соответственно выводятся на форму через Invoke.
Проблемма заключается в том, что если операции в потоках не завершились, а пользователь попытается закрыть форму будет вызвано исключение с текстом вроде Cannot access disposed object. Из-за того, что события от потоков приходят, а Invoke уже делать нельзя.

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

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

Автор: emmanuil 4.2.2009, 13:25
Для начала при закрытии той формы отпишись от всех событий. Или если у тебя без событий, то при посылке в форму данных проверь на null и IsDisposed.

Автор: Rififi 4.2.2009, 13:37
nyxiscoo1, 
Перед закрытием формы гаси потоки с ожиданием их завершения.
Более правильный с точки зрения исключений вариант - создать все потоки в отдельном домене и при завершении работы выгружать его.

Автор: nyxiscoo1 4.2.2009, 18:08
Спасибо всем за оперативные ответы, вы мне очень помогли. 
Вопрос решен.

Автор: emmanuil 4.2.2009, 18:27
Если просто закрывается форма с прогрессом и результатами, а работа должна идти дальше, то ничего гасить не нужно, а только отписаться и проверять как я писал. Учти, что остановка потока может занять не мало времени. Если же ты хочешь просто прервать операцию, то с доменами будет лучше, если будет сбой в одном домене, то это не приводит к сбоям внутри хост-процесса. Но обмен данными между доменами медленнее чем прямые вызовы. Если критична скорость, то стоит подумать. Анализируй и выбирай. smile

Автор: nyxiscoo1 5.2.2009, 20:40
Реализовал вариант с доменами, спасибо за совет, все работает отлично. Раньше и не подозрвел, что ими так легко пользоваться smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)