Что мешает собирать нити в C #? - PullRequest
14 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 6 ]

14 голосов
/ 17 сентября 2008

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

7 голосов
/ 19 сентября 2008

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

2 голосов
/ 17 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

class YourClass
{
  Thread thread;

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

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

0 голосов
/ 17 сентября 2008

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

...