| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Не убивается процесс |
| Автор: sindi8 1.8.2005, 16:05 | ||
| Всем привет. Никак не могу одолеть грабли - создаю я ассинхронный процесс, процесс запускается и отрабатывает что от него требуется. Но при закрытии формы приложение остается висеть в списке запущенных процессов в task manager-e. Не подскажите как с этим бороться? Делаю следующим образом:
|
| Автор: arilou 1.8.2005, 16:16 |
| Ты не мог бы привести полный текст программы? |
| Автор: sindi8 1.8.2005, 16:39 | ||
Выглядит все примерно так (выбросил блок сгенеренный студией и Dispose):
Если нужен полностью рабочий пример - могу скинуть в мыло. |
| Автор: mr.DUDA 1.8.2005, 17:58 | ||
| Скорее всего, вызываемый асинхронно поток по какой-то причине не завершает работу, а остаётся висеть. Добавлено @ 18:00 З.Ы, только что увидел:
Так делать нельзя. С формой и контролами можно работать только в их "родных" потоках, а из других потоков - только с использованием метода Control.Invoke. Возможно, именно по этой причине глюки. |
| Автор: sindi8 1.8.2005, 18:11 |
| Спасибо за наводку. Не знал про это. Попробую, может действительно из-за этого. З.Ы. правда думал что сборщик мусора ВСЕ прибивает при завершении приложения. |
| Автор: arilou 1.8.2005, 18:28 | ||
GC тут ни при чем. Может не работать из-за того, что в потоке Exception происходит. Он подвисает, и из-за этого приложение не завершает работу. |
| Автор: mr.DUDA 1.8.2005, 23:01 |
| arilou, вполне может висеть потому, что форма вроде как бы уже закрывается (и может даже закрылась), а в это время к ней обращается др. поток с попыткой подвинуть прогрессбар... Или любой другой потенциальный дедлок. Кстати, в .NET 2.0 такие "наезды" на контрол (им. ввиду код, взаимодействующий с контролом или формой из др. потока) приводят к exception -- имхо, здравая идея. Как известно, в .NET все контролы и формы реализованы на "старом добром" WinAPI, а он шуток не любит... |
| Автор: -ser- 2.8.2005, 07:06 | ||
может быть вас смущает в task manager-e в списке запущенных процессов ваш <project_name>.vshost.exe? так это от самой студии (если вы используете 2005), он всегда там есть, пока проект открыт. я попробовал ваш код у себя, все корректно отрабатывает (разумеется с вызовом Invoke на контролах, о чем упомянул mr.DUDA. ошибка сия непозволительная в .NET 2.0, но как я полагаю, дело не в этом, поскольку форму вы закрыть все же смогли). и попробовал ваш код как есть без каких-либо изменений вообще в студии 2003. в task manager-e в списке запущенных процессов появляется <project_name>.exe. при закрытии формы он благополучно исчезает. |
| Автор: sindi8 2.8.2005, 12:18 | ||||||
| На счет понимания task manager-а проблем не испытываю. А вот на счет использования Control.Invoke есть вопрос - правильно ли я понял, что мне нужно написать делегат, в котором бы как раз происходило изменение этих самый свойств контролов? и каким образом этот делегат правильно вызывать: грубо говоря так
а в tmpDelegate прописать все нужные изменения контролов основного потока?
Так в том-то и дело, что все отрабатывается, прогрессбар бегает, значения label1 изменяются ну и т.д. Т.е. внешне проложение работает вполне корректно. Дело по всей вероятности видимо именно в этих Invoke, о которых говорил mr.DUDA и другие.
Ну если бы все было так же гладко - я думаю данная тема бы не появилась. |
| Автор: arilou 2.8.2005, 12:23 | ||||
Да, именно так. Чтобы не создавать лишних делегатов, можно использовать, например, делегат MethodInvoker
где controlFunction - та ф-ция, в которой находится код, изменяющий свойства контрола. Кстати, можно не заморачиваться, и вызызывать Form.Invoke, т.к. на форме не может быть контролов, созданных из других потоков. кроме как создавшего форму. Добавлено @ 12:29
Тут дело хитрое - я заметил, что если ты вызываешь метод асинхронно, и если в нем исключение происходит, то тогда никто тебе о нем не сообщает, по крайней мере, так было в моем сценарии. Потко просто тихо умирал, и программа не стопалась. Наверное, именно по этой причине .NET 2.0 тебе не сообщил, что у тебя InvalidOperationException, когда ты контролы модифицировал из другого потока. |
| Автор: sindi8 2.8.2005, 12:31 |
| Спасибо всем. Сейчас буду тестировать. Да, и у меня кстати .NET 1.1. По непонятным для меня причинам мне на ящик не пришло подтверждение заявки на 2005-ю студию и соответственно студия не пришла. |
| Автор: arilou 2.8.2005, 12:33 | ||||
Да, именно так
Добавлено @ 12:41
Тогда все понятно, в 1.1. такой фичи не было (насчет перехвата таких ситуаций). |
| Автор: sindi8 2.8.2005, 12:58 |
| На счет MethodInvoker - его видимо можно использовать только в том случае, если функция, выполняющая нужные дествия с контролами, без параметров. Если есть параметры - нужно все таки делегаты самому создавать. Или я заблуждаюсь? |
| Автор: arilou 2.8.2005, 12:59 |
| Так и есть. |
| Автор: sindi8 2.8.2005, 13:36 |
| Проблема решена. Всем большое спасибо. Все решилось путем использования Control.Invoke и описанием делегатов, ссылающихся на функции обработки необходимый действий над контролами. Вопрос на засыпку |
| Автор: arilou 2.8.2005, 13:47 | ||||
Вот нарыл в MSDN:
Лучше говорить "асинхронного вызова", а то я, например, сразу не понял, о чем речь идет в самом первом посте |
| Автор: sindi8 2.8.2005, 14:12 | ||
MSDN читал. Пробовал воспроизвести нечто подобное, но приложение залипало на
и как-то это сделать нормально чтоб работало у меня не получилось. В общем - если кто поделится парой строк - буду признателен. Хотелось бы узнать, как выполнить какую-то функцию по завершении работы потока. З.Ы. слово "поток" надеюсь более корректно |
| Автор: arilou 2.8.2005, 14:25 | ||
Вот. Тут код на VB.NET, но я думаю, ты без проблем его заюзаешь. Он реализует то, что тебе надо - fire and foget - вызвал и забыл
|
| Автор: sindi8 2.8.2005, 17:24 |
| arilou, спасибо. Думаю разберусь. |
| Автор: mr.DUDA 2.8.2005, 21:57 |
| arilou, Visual Basic.... |