Я только что увидел этот вопрос: Можно ли использовать статические методы в классе File в С#?. Подводя итог OP имеет IOException
, потому что файл используется в этом фрагменте кода ASP.NET:
var text= File.ReadAllText("path-to-file.txt");
// Do something with text
File.WriteAllText("path-to-file.txt");
Моя первая мысль была простой проблемой одновременного доступа из-за множественных запросов ASP.NET. Что-то я решил бы централизовать ввод-вывод в синхронизированный потокобезопасный класс (или отбрасывать файлы в пользу чего-то еще). Я прочитал оба ответа, и когда я собирался понизить один из них, я увидел, кто эти пользователи, и я подумал, что это за h * и остановился.
Я приведу их обоих (тогда, пожалуйста, обратитесь к оригинальным ответам для большего контекста).
Для этого пункта OP:
Я предполагаю, что операция чтения файла иногда не закрывает файл до того, как произойдет операция записи [...]
В ответ говорится:
Правильно. Файловые системы хорошо не поддерживают атомные обновления [...] Использование FileStream не помогает [...] У файла нет магии внутри. Он просто использует FileStream, завернутый для вашего удобства.
Однако я не вижу ожиданий для атомной операции (чтение + последующая запись) и параллельной (из-за частично перекрывающихся многопоточных запросов) может вызвать одновременный доступ. Даже операция атомарного ввода-вывода (чтение + запись) будет иметь точно такую же проблему. OK FileStream
может быть асинхронным, но не использовать File.ReadAllText()
и File.WriteAllText()
.
Другой ответ заставил меня гораздо более озадачен, он говорит:
Несмотря на то, что согласно документации файл-дескриптор гарантированно закрывается этим методом, даже если исключения подняты, время закрытия не гарантируется, прежде чем метод вернется: закрытие может выполняться асинхронно.
Что? MSDN говорит, что метод откроет, прочитает и закроет файл (также в случае исключений). Возможно ли, что такой метод будет закрывать файл асинхронно? Остановит ли ОС CloseHandle()
? В каких случаях? Почему?
Короче: это просто недоразумение или CloseHandle()
является асинхронным? Мне не хватает чего-то важного чрезвычайно?