![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
Всем привет.
Никак не могу одолеть грабли - создаю я ассинхронный процесс, процесс запускается и отрабатывает что от него требуется. Но при закрытии формы приложение остается висеть в списке запущенных процессов в task manager-e. Не подскажите как с этим бороться? Делаю следующим образом:
|
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Ты не мог бы привести полный текст программы?
|
|||
|
||||
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
Выглядит все примерно так (выбросил блок сгенеренный студией и Dispose):
Если нужен полностью рабочий пример - могу скинуть в мыло. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Скорее всего, вызываемый асинхронно поток по какой-то причине не завершает работу, а остаётся висеть.
Добавлено @ 18:00 З.Ы, только что увидел:
Так делать нельзя. С формой и контролами можно работать только в их "родных" потоках, а из других потоков - только с использованием метода Control.Invoke. Возможно, именно по этой причине глюки. -------------------- ![]() |
|||
|
||||
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
Спасибо за наводку. Не знал про это. Попробую, может действительно из-за этого.
З.Ы. правда думал что сборщик мусора ВСЕ прибивает при завершении приложения. |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
GC тут ни при чем. Может не работать из-за того, что в потоке Exception происходит. Он подвисает, и из-за этого приложение не завершает работу. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
arilou, вполне может висеть потому, что форма вроде как бы уже закрывается (и может даже закрылась), а в это время к ней обращается др. поток с попыткой подвинуть прогрессбар... Или любой другой потенциальный дедлок. Кстати, в .NET 2.0 такие "наезды" на контрол (им. ввиду код, взаимодействующий с контролом или формой из др. потока) приводят к exception -- имхо, здравая идея. Как известно, в .NET все контролы и формы реализованы на "старом добром" WinAPI, а он шуток не любит...
-------------------- ![]() |
|||
|
||||
| -ser- |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 1.2.2005 Репутация: 5 Всего: 13 |
может быть вас смущает в task manager-e в списке запущенных процессов ваш <project_name>.vshost.exe? так это от самой студии (если вы используете 2005), он всегда там есть, пока проект открыт. я попробовал ваш код у себя, все корректно отрабатывает (разумеется с вызовом Invoke на контролах, о чем упомянул mr.DUDA. ошибка сия непозволительная в .NET 2.0, но как я полагаю, дело не в этом, поскольку форму вы закрыть все же смогли). и попробовал ваш код как есть без каких-либо изменений вообще в студии 2003. в task manager-e в списке запущенных процессов появляется <project_name>.exe. при закрытии формы он благополучно исчезает. -------------------- "Тонкая, однако, работа." |
|||
|
||||
| sindi8 |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
На счет понимания task manager-а проблем не испытываю.
А вот на счет использования Control.Invoke есть вопрос - правильно ли я понял, что мне нужно написать делегат, в котором бы как раз происходило изменение этих самый свойств контролов? и каким образом этот делегат правильно вызывать: грубо говоря так
а в tmpDelegate прописать все нужные изменения контролов основного потока?
Так в том-то и дело, что все отрабатывается, прогрессбар бегает, значения label1 изменяются ну и т.д. Т.е. внешне проложение работает вполне корректно. Дело по всей вероятности видимо именно в этих Invoke, о которых говорил mr.DUDA и другие.
Ну если бы все было так же гладко - я думаю данная тема бы не появилась. Это сообщение отредактировал(а) sindi8 - 2.8.2005, 12:25 |
||||||
|
|||||||
| arilou |
|
||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Да, именно так. Чтобы не создавать лишних делегатов, можно использовать, например, делегат MethodInvoker
где controlFunction - та ф-ция, в которой находится код, изменяющий свойства контрола. Кстати, можно не заморачиваться, и вызызывать Form.Invoke, т.к. на форме не может быть контролов, созданных из других потоков. кроме как создавшего форму. Добавлено @ 12:29
Тут дело хитрое - я заметил, что если ты вызываешь метод асинхронно, и если в нем исключение происходит, то тогда никто тебе о нем не сообщает, по крайней мере, так было в моем сценарии. Потко просто тихо умирал, и программа не стопалась. Наверное, именно по этой причине .NET 2.0 тебе не сообщил, что у тебя InvalidOperationException, когда ты контролы модифицировал из другого потока. Это сообщение отредактировал(а) arilou - 2.8.2005, 12:34 |
||||
|
|||||
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
Спасибо всем. Сейчас буду тестировать.
Да, и у меня кстати .NET 1.1. По непонятным для меня причинам мне на ящик не пришло подтверждение заявки на 2005-ю студию и соответственно студия не пришла. Это сообщение отредактировал(а) sindi8 - 2.8.2005, 12:35 |
|||
|
||||
| arilou |
|
||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Да, именно так
Добавлено @ 12:41
Тогда все понятно, в 1.1. такой фичи не было (насчет перехвата таких ситуаций). |
||||
|
|||||
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
На счет MethodInvoker - его видимо можно использовать только в том случае, если функция, выполняющая нужные дествия с контролами, без параметров. Если есть параметры - нужно все таки делегаты самому создавать. Или я заблуждаюсь?
|
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Так и есть.
|
|||
|
||||
| sindi8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 6.6.2005 Где: Москва Репутация: нет Всего: нет |
Проблема решена. Всем большое спасибо. Все решилось путем использования Control.Invoke и описанием делегатов, ссылающихся на функции обработки необходимый действий над контролами.
Вопрос на засыпку Это сообщение отредактировал(а) sindi8 - 2.8.2005, 14:22 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |