Как сборки мусора и фоновые потоки взаимодействуют в .NET? - PullRequest
2 голосов
/ 14 января 2010

Допустим, я создаю объект, и этот объект запускает поток и присваивает один из его частных методов экземпляра ThreadStart. Позже все ссылки на этот объект исчезли. Что просходит? Является ли объект никогда не мусором, потому что поток содержит ссылку на него через указатель this? С другой стороны, если я использую статический метод, как поток может обнаружить, что его объект был собран и завершен сборщиком мусора?

Я знаю, что обычно не следует делать время жизни потоков зависимым от сборки мусора. Я не хочу, чтобы мой объект протекал, если он неправильно расположен.

Ответы [ 2 ]

4 голосов
/ 14 января 2010

Создание потока не содержит прямой ссылки на объект, за исключением любых ссылок, косвенно сохраняемых через делегат. Поток использует ThreadStart для начала работы, но он не содержит ссылки, кроме выполняемого делегата.

Если метод является методом экземпляра, объект не будет собираться мусором до тех пор, пока метод потока не завершится. Делегат требует ссылку на экземпляр объекта и сохраняет его в корне. Когда делегат потока завершает работу, рассматриваемый объект становится без корня и может использоваться для сборки мусора.

Если это статический метод, это не проблема. Нет ссылки на экземпляр - только на тип. На экземпляр, который запустил поток, не будет ссылаться вновь созданный поток - поэтому он будет работать до завершения его метода, а затем завершит работу. Сборка мусора экземпляра обрабатывается так же, как если бы поток не существовал (то есть: когда другие ссылки исчезнут, объект будет доступен для GC).

0 голосов
/ 14 января 2010

Если вы храните делегат в методе экземпляра где-то (например, передавая его потоку), делегат будет содержать ссылку на объект, который будет храниться где-то в TreadObject, поэтому объект не будет собирать мусор пока поток не закончится.

Если вы дадите ThreadStart статический метод, делегат не будет содержать никаких ссылок на экземпляры, поэтому сборщик мусора не будет препятствовать существованию потока (по крайней мере, когда дело доходит до рассматриваемого объекта).

...