![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| NoLogin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 26.12.2008 Репутация: нет Всего: нет |
Доброе время суток!
В общем есть у меня компонента, написанная под 1с на C#. При создании таких компонент очень актуален вопрос их выгрузки из памяти в момент закрытия программы иначе появляется процесс-призрак, который приходится гасить через диспетчер задач. Короче говоря, при запуске 1с загружается моя компонента, а в ней в момент загрузки запускается с использованием System.Threading.Timer специальная процедура, точнее она должна запускаться каждые 5 секунд. Задача этой процедуры определить, не закрыта ли еще 1с и если закрыта и процесс в памяти висит, то погасить его. Определяю я "закрыта/не закрыта" 1с следующим образом: я считываю текущий процесс (Process MyProc1C = Process.GetCurrentProcess()), затем считываю свойство MainWindowTitle (MyProc1C.MainWindowTitle) и если это свойство пусто, значит прога закрыта и текущий процесс нужно погасить. Прикол в том, что это у меня работало в предыдущей конторе, при чем на множестве компов. А сейчас такая лажа: после первого запуска процедуры, которая должна запускаться каждые несколько секунд, она больше не запускается. Если я например, считываю свойство Id (MyProc1C.Id) или HasExited или другие свойства, то процедура как и должно быть запускается с заданной периодичностью, но стоит мне попытаться прочитать MainWindowTitle или MainWindowHandle, то все - процедура больше не запускается. |
|||
|
||||
| NoLogin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 26.12.2008 Репутация: нет Всего: нет |
Все, разобрался.
Как говорится, Если ничего не получается, прочтите инструкцию. As long as you are using a Timer, you must keep a reference to it. As with any managed object, a Timer is subject to garbage collection when there are no references to it. The fact that a Timer is still active does not prevent it from being collected. В общем, после того как я считывал MainWindowTitle, мой таймер убивался сборщиком мусора (хотя в других ситуациях он оставался в живых), так что я создал переменную уровня класса и все заработало. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |