Использование оператора using с StreamWriter в C # - PullRequest
0 голосов
/ 24 октября 2011

Мое приложение имеет регистратор, который постоянно записывает данные в различные файлы. Регистрация в каждом файле выполняется синхронно с использованием объекта StreamWriter внутри блока «using». Время от времени я получаю исключение о том, что файл, который я пытаюсь открыть, используется другим процессом.

Теперь файлы, в которые я вхожу, имеют уникальное имя, связанное с идентификатором клиента. Мое приложение является многопоточным, но в любой момент времени активен только 1 экземпляр клиента, поэтому я уверен, что один и тот же файл не открывается более чем одним потоком. Однако мое приложение регистрирует один и тот же файл несколько раз, скажем, менее чем за 1 секунду, при каждом повторном открытии файла. Это оставляет меня к другому выводу, что оператор «using» не сразу закрывает файл (даже если я читал, что он делает для файлов), а только удаляет его и ждет, пока GC обработает закрытие.

Правильно ли сделан мой вывод или что-то еще вызывает исключение?

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

После выхода из оператора using выполняется не только вызов Close, но и Dispose, причина using - это ничто иное, как синтаксис sugare для

try {
  //do stuff 
}
finally {
 //close, dispose stream object
}

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

РЕДАКТИРОВАТЬ

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

0 голосов
/ 24 октября 2011

Оператор using вызовет Dispose для FileStream, который немедленно освободит основной дескриптор файла. Ваша проблема связана с перекрытием записей в файле.

0 голосов
/ 24 октября 2011

Ваш вывод неверен.После закрытия с помощью Close или Dispose (или выхода из блока использования) вы можете немедленно открыть файл в другом блоке.

Должен быть какой-то другой поток, использующий файл.

...