Ваш код в порядке, хотя блокировка в финализаторе несколько "страшна", и я бы этого не допустил - если вы зашли в тупик ... Я не уверен на 100%, что произойдет, но это не будет хорошо. Однако, если вы в безопасности, это не должно быть проблемой. В основном. Внутренние элементы сборки мусора болезненны, и я надеюсь, что вам никогда не придется их видеть;)
Как отмечает Марк Гравелл, изменчивый бул позволит вам избавиться от блокировки, что уменьшит эту проблему. Реализуйте это изменение, если можете.
Код nedruod помещает назначение в проверку if (распоряжение), что совершенно неверно - поток является неуправляемым ресурсом и должен быть остановлен, даже если он не был явно уничтожен. Ваш код в порядке, я просто указываю, что вы не должны следовать советам, приведенным в этом фрагменте кода.
Да, вам почти всегда следует вызывать Dispose () из финализатора при реализации шаблона IDisposable. Полный шаблон IDisposable немного больше, чем у вас, но он вам не всегда нужен - он просто предоставляет две дополнительные возможности:
- определение того, был ли вызван Dispose () или выполняется финализатор (вам не разрешается касаться каких-либо управляемых ресурсов в финализаторе, за исключением завершаемого объекта);
- включение подклассов для переопределения метода Dispose ().