Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

class YourClass
{
  Thread thread;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top