Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятка с System.Threading.Timer 
:(
    Опции темы
NoLogin
Дата 27.7.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, то все - процедура больше не запускается.
PM MAIL   Вверх
NoLogin
Дата 27.7.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, мой таймер убивался сборщиком мусора (хотя в других ситуациях он оставался в живых), так что я создал переменную уровня класса и все заработало.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0365 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.