![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
nyxiscoo1 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 15.6.2008 Репутация: нет Всего: нет |
Доброго времени суток, уважаемые форумчане. Нужен ваш совет.
Есть приложение, которое в запускает несколько операций в отдельных потоках и слушает эвенты этих операций, при этом есть форма, которая отображает прогресс и прочую статистику выполнения операций на основе данных полученных с помощию событий. Данные полученные от событий соответственно выводятся на форму через Invoke. Проблемма заключается в том, что если операции в потоках не завершились, а пользователь попытается закрыть форму будет вызвано исключение с текстом вроде Cannot access disposed object. Из-за того, что события от потоков приходят, а Invoke уже делать нельзя. Подскажите пожалуйста, какие действия необходимо выполнить, чтобы корректно завершить работу программы в случае описанном выше. Вариант с перехватом данного исключения мне не кажется правильным, я думаю должен быть более правильный способ. |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
Для начала при закрытии той формы отпишись от всех событий. Или если у тебя без событий, то при посылке в форму данных проверь на null и IsDisposed.
Это сообщение отредактировал(а) emmanuil - 4.2.2009, 13:26 |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 5 Всего: 36 |
nyxiscoo1,
Перед закрытием формы гаси потоки с ожиданием их завершения. Более правильный с точки зрения исключений вариант - создать все потоки в отдельном домене и при завершении работы выгружать его. |
|||
|
||||
nyxiscoo1 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 15.6.2008 Репутация: нет Всего: нет |
Спасибо всем за оперативные ответы, вы мне очень помогли.
Вопрос решен. |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
Если просто закрывается форма с прогрессом и результатами, а работа должна идти дальше, то ничего гасить не нужно, а только отписаться и проверять как я писал. Учти, что остановка потока может занять не мало времени. Если же ты хочешь просто прервать операцию, то с доменами будет лучше, если будет сбой в одном домене, то это не приводит к сбоям внутри хост-процесса. Но обмен данными между доменами медленнее чем прямые вызовы. Если критична скорость, то стоит подумать. Анализируй и выбирай.
![]() |
|||
|
||||
nyxiscoo1 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 15.6.2008 Репутация: нет Всего: нет |
Реализовал вариант с доменами, спасибо за совет, все работает отлично. Раньше и не подозрвел, что ими так легко пользоваться
![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |