Стек вычислений и сборщик мусора
От: Аноним  
Дата: 06.06.08 19:04
Оценка:
Всем привет.

Кто-нибудь знает учитывает ли сборщик мусора ссылки находящиеся в стеке метода?
Ситуация такая: есть приложение (starter) которое запускает другое приложение (app) и после старта ждёт установки евента вторым приложением, после чего завершает свою работу.
Starter ждёт event через OpenEvent/WaitForSingleObject, app устанавливает евент в FormLoad методе формы таким образом:
new EventWaitHandle(true, EventResetMode.ManualReset, "eventname").Set();

Т.е. для переменной память не выделяется, объект просто создаётся в evaluation стеке.
В итоге достаточно часто event не устанавливался и starter продолжал выполнятся.

Я провел эксперимент, запустил три потока, в первом цикл ожидания евента, во втором цикл с выжиданием несколько милмисекунд и попыткой установить евент, в третьем бесконечный цикл с принудительной сборкой мусора
while(true){
  GC.Collect();
  GC.WaitForPendingFinalizers();
  GC.Collect();
}

в результате евент либо ни разу не устанавливался, либо устанаваливался всего пару раз на десятки вызовов.

После того как в приложение добавил переменную и стал ей присваивать ссылку на евент всё заработало так как нужно:
private EventWaitHandle _starteEventHadle;
void FormLoad(...)
{
.....
  _starteEventHadle= new EventWaitHandle(true, EventResetMode.ManualReset, "eventname");
.....
}


Собсвенно правильно ли я решил, что проблема из-за того, что объект уничтожался? И если нет, то в чём тогда она может быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.