Достаточно ли FileStream.Dispose? - PullRequest
       31

Достаточно ли FileStream.Dispose?

1 голос
/ 10 ноября 2010

Я использую классы FileStream и StreamReader примерно так:

using(FileStream stream = File.Open(filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
    using(var reader = new StreamReader(stream))
    {
        content = reader.ReadToEnd();
    }                    
}

Это означает, что я избавляюсь от них обоих.

Однако, запустив другое приложение, я обнаружил, что есть некоторая блокировка, оставшаяся от файла, который я читаю.

Как и в случае с Dispose, я должен также вызывать Finalize или Close?

ура!

ОБНОВЛЕНИЕ - Почему я думаю, что происходит блокировка:

У меня есть служба, которая записывает в некоторые файлы журнала.

Приведенный выше код взят из другого приложения WCF, которое читает журналы.

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

если служба WCF работает (которая содержит приведенный выше код), я получаю исключения ввода-вывода при запуске приложения развертывания, даже если основная служба уже остановлена ​​(служба, которая записывает в журналы).

Когда служба WCF не запущена, я не получаю никаких исключений ввода-вывода и могу безопасно перемещать файлы.

Единственный ввод-вывод, который выполняет WCF, выше ... так что я предполагаю, что он где-то хранит какую-то блокировку ..?

Ответы [ 2 ]

8 голосов
/ 10 ноября 2010

Нет, нет необходимости вызывать close в потоке, главным образом потому, что метод dispose для читателя все равно будет делать это явно

Быстрый взгляд на код в отражателе показывает это

...
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
...

, следовательно, когда dispose (true) вызывается в Reader, основной поток закрывается, а затем, когда блоки использования выходят, все объекты готовы для сборки мусора.

Операторов using достаточно для освобождения ресурсов, поэтому существует шаблон IDisposable:)

4 голосов
/ 10 ноября 2010

Это избавление, как вполне достойно.StreamReader.Dispose () уже удалит файловый поток, FileStream.Dispose () пожмет плечами и не будет жаловаться.

Если есть какая-либо заметная проблема, то это File.OpenRead ().Вы не указали значение FileShare, оно будет использовать FileShare.Read.Это довольно нормально, но это не удастся, если кто-то другой откроет файл для записи.Вы не можете пропустить FileShare.Write, если кто-то уже получил право на запись.Утилита SysInternals 'Handle может быть полезна для диагностики подобных проблем.

...