Что предотвращает сбор нити в С#?

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

Это сложная функция сборщика мусора. Текущие потоки не собираются.

Ответ 4

Хорошо, можно с уверенностью предположить, что если поток работает где-то, что-то имеет ссылку на него, то этого было бы недостаточно, чтобы остановить сбор мусора?

Ответ 5

Важно отметить, что - если ваш поток отмечен IsBackground = True, это не помешает всему процессу выйти из

Ответ 6

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

class YourClass
{
  Thread thread;

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

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