Что мешает сбору потока в С#?

Какой механизм в .NET после этого кода предотвращает сборку мусора для объекта Thread?

new Thread(Foo).Start();
GC.Collect();

Да, можно с уверенностью предположить, что что-то имеет ссылку на ветку, я просто блуждал, что именно. По какой-то причине Reflector не показывает мне System.Threading, поэтому я не могу его копать (я знаю, что MS выпустила исходный код для .NET framework, просто у меня его нет под рукой).


person ripper234    schedule 17.09.2008    source источник


Ответы (6)


Среда выполнения сохраняет ссылку на поток, пока он выполняется. Сборщик мусора не соберет его, пока кто-то сохраняет эту ссылку.

person EricSchaefer    schedule 17.09.2008

Это зависит от того, запущен ли поток или нет. Если вы только что создали объект Thread и не запускали его, это обычный управляемый объект, т.е. подходящий для GC. Как только вы запускаете поток или когда вы получаете объект Thread для уже запущенного потока (GetCurrentThread), все немного по-другому. «Открытый объект», управляемый поток, теперь содержит строгую ссылку в среде CLR, поэтому вы всегда получаете один и тот же экземпляр. Когда поток завершается, эта сильная ссылка освобождается, и управляемый объект будет собран, как только у вас не будет других ссылок на (теперь мертвый) поток.

person Ilya Ryzhenkov    schedule 19.09.2008

Это встроенная функция сборщика мусора. Запущенные потоки не собираются.

person ima    schedule 17.09.2008

Что ж, можно с уверенностью предположить, что если где-то запущен поток, на который что-то ссылается, не будет ли этого достаточно, чтобы остановить сборку мусора?

person Jon    schedule 17.09.2008

Важно отметить, что если ваш поток помечен как IsBackground=True, это не предотвратит завершение всего процесса.

person Damien_The_Unbeliever    schedule 19.09.2008

Назначить новый поток локальному полю?

class YourClass
{
  Thread thread;

  void Start()
  {
    thread = new Thread(Foo);
    thread.Start();
    GC.Collect();
  }
}

Сборка мусора собирает все, что не является ссылкой, поэтому в вашем коде нет поля/переменной, ссылающейся на поток, поэтому он будет собран.

person Grad van Horck    schedule 17.09.2008
comment
Нет, не будет. Среда выполнения сохраняет ссылку. В противном случае работающий поток будет собран, если вы потеряете ссылку. - person EricSchaefer; 18.09.2008