| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .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 |
| Если просто закрывается форма с прогрессом и результатами, а работа должна идти дальше, то ничего гасить не нужно, а только отписаться и проверять как я писал. Учти, что остановка потока может занять не мало времени. Если же ты хочешь просто прервать операцию, то с доменами будет лучше, если будет сбой в одном домене, то это не приводит к сбоям внутри хост-процесса. Но обмен данными между доменами медленнее чем прямые вызовы. Если критична скорость, то стоит подумать. Анализируй и выбирай. |
| Автор: nyxiscoo1 5.2.2009, 20:40 |
| Реализовал вариант с доменами, спасибо за совет, все работает отлично. Раньше и не подозрвел, что ими так легко пользоваться |