Поток не будет собран, потому что каждый работающий, ожидающий или приостановленный поток сам по себе используется GC для определения того, что является живым (отслеживание всего в стеке каждого потока, отслеживание всего, на что ссылаются все эти объекты, затем все, на которое ссылаются и т. д., и вы определили все, что нельзя собрать мусором).
Поток мог бы закончиться, если бы он был фоновым, потому что тогда он будет активно остановлен, когда все остальные потоки в процессе завершатся. В противном случае единственное, что может привести к его смерти - это активный процесс, исключение (включая ThreadAbortException
) или выход из самого цикла while
.
Есть случай, который в некотором смысле сопоставим, возможно, это то, о чем вы думаете:
var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5));
int someResult = doingSomethingElse();
doSomethingElseThatTakesLongerThan5Seconds();
Это еще один фрагмент кода, который заставляет другой поток выполнения что-то делать. В этом случае таймер действительно может быть собран сборщиком мусора перед запуском, во время одного из запусков или практически в любое время после возврата конструктора.
Здесь важно то, что для таймера нет отдельного потока, и этот поток даже не «знает» об объекте таймера. С тех пор как последний доступ к объекту произошел, он может быть собран. Это отличается от вопроса об отдельном потоке, который работает (или ожидает и т. Д.).