Что мешает сбору потока в C #?
-
09-06-2019 - |
Вопрос
В .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();
}
}
Сборка мусора собирает все, что не является ссылками, поэтому в вашем коде нет поля / переменной, ссылающейся на поток, поэтому оно будет собрано.