Всем привет.
Кто-нибудь знает учитывает ли сборщик мусора ссылки находящиеся в стеке метода?
Ситуация такая: есть приложение (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");
.....
}
Собсвенно правильно ли я решил, что проблема из-за того, что объект уничтожался? И если нет, то в чём тогда она может быть?