2009-11-11 3 views
10

Я заметил, что System.Threading.Thread реализует финализатор, но не IDisposable. Рекомендуемая практика заключается в том, чтобы всегда реализовывать IDisposable при реализации финализатора. Джеффри Рихтер wrote, что руководство является «очень важным и всегда следует без исключения».Почему реализация Thread IDisposable не используется?

Так почему же реализация Thread IDisposable? Похоже, что реализация IDisposable была бы непрекращающимся изменением, которое позволило бы детерминированную очистку конечных ресурсов Thread.

И связанный с этим вопрос: поскольку поток финализирован, нужно ли удерживать ссылки на выполняемые потоки, чтобы они не были завершены во время выполнения?

ответ

8

Что делать с объективом Thread? «Ресурс» в этом случае имеет свою естественную очистку - финишную нить. Обратите внимание, что также отсутствует чувство собственности ... в исполняемом потоке вы всегда можете использовать Thread.CurrentThread, так что только эта нить действительно сможет претендовать на какую-либо собственность.

В целом, я думаю, что Thread - это немного необычный случай - в базовом ресурсе есть жизнь, но это не то, что должно быть очищено явно.

+0

Поскольку ManagedThreadID является целым числом и может быть прочитан даже до начала потока, это предполагает, что что-то выделяется при создании потока (даже если это только номер). Хотя для приложения было бы странно создавать 2 + миллиард объектов Threads, казалось бы, идентификаторы будут ресурсом, который может быть достоин релиза. – supercat

+0

@supercat: Интересный момент. «ManagedThreadId», по-видимому, распределяется последовательно - я не знаю, что произойдет после того, как вы создали более 2 миллиардов из них. –

+0

Иды, кажется, используются повторно, когда объекты Thread становятся доступными для завершения, поэтому я подозреваю, что Threading.Thread реализует Finalize, но не IDIsposable. – supercat

3

Это, вероятно, потому, что вы не можете распоряжаться темы. Вместо этого вы можете попросить его умереть, используя Abort() или похожий.

+0

Вы можете, но в целом использование Abort не считается хорошей практикой - просто убедитесь, что метод потока возвращается (используя bool или аналогичный), и система очищает остальные. –

1

Это своего рода проектный вопрос, поэтому любой, кто не участвовал в создании этого аспекта .NET, может только спекулировать. При этом this blog post делает хорошую оценку:

... реализация IDisposable не имеет никакого значения, по крайней мере, в текущей реализации Thread. Я увеличил количество создаваемых потоков и количество обработчиков уменьшилось в какой-то момент, так что есть некоторый механизм их закрытия.

Нити естественно очищаются после себя, поэтому они не являются ресурсом, которым необходимо управлять в типичном смысле.

Смежные вопросы