我刚刚看到这个问题:在 C# 中的 File 类上使用静态方法安全吗? https://stackoverflow.com/q/32413634/1207195。总结一下OP有一个IOException
因为该 ASP.NET 代码片段中正在使用文件:
var text= File.ReadAllText("path-to-file.txt");
// Do something with text
File.WriteAllText("path-to-file.txt");
我的第一个想法是这是一个simple由于多个 ASP.NET 重叠请求而导致的并发访问问题。我想解决将 I/O 集中到同步线程安全类中(或删除文件以支持其他内容)的问题。我读了两个答案,当我准备对其中一个答案投反对票时,我看到了这些用户是谁,我想什么啊*然后停了下来。
我将引用它们(然后请参阅原始答案以获取更多上下文)。
对于这个OP段落:
我猜测文件读取操作有时不会在写入操作发生之前关闭文件[...]
一个答案说:
正确的。文件系统不能很好地支持原子更新 [...] 使用 FileStream 没有帮助 [...] 文件内部没有魔力。为了方便起见,它只是使用 FileStream 包装。
然而,我没有看到任何原子操作的期望(读取+后续写入)并且parallel(因为多线程请求部分重叠)可能会导致并发访问。甚至一个atomicI/O 操作(读+写)也会有完全相同的问题。好的FileStream
may是异步的,但不是异步的File.ReadAllText()
and File.WriteAllText()
use it.
另一个答案让我更加困惑, 它说:
尽管根据文档,文件句柄保证通过此方法关闭,但即使引发异常,也不能保证关闭时间发生在方法返回之前:关闭可以异步完成。
什么? MSDN 说该方法将打开、读取和关闭文件(也有例外情况)。这种方法是否有可能异步关闭文件?操作系统会推迟吗CloseHandle()
?在哪些情况下?为什么?
简而言之:这只是一场误会还是CloseHandle()
是异步的吗?我缺少一些东西极其重要的?
如果你看一下CloseHandle https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx文档中,它指出每个打开句柄的方法都有如何关闭它的描述:
创建这些对象的函数的文档
指示当您完成后应使用 CloseHandle
对象,以及对象上的挂起操作之后会发生什么
手柄已关闭。一般来说,CloseHandle 会使
指定的对象句柄,减少对象的句柄计数,并且
执行对象保留检查。在对象的最后一个句柄之后
关闭后,该对象将从系统中删除。
当你看着CreateFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx文档,这就是它所说的:
当应用程序使用返回的对象句柄完成时
CreateFile,使用CloseHandle函数关闭句柄。这不
仅释放系统资源,但可以对事物产生更广泛的影响
例如共享文件或设备并将数据提交到磁盘。
我会觉得很奇怪CloseHandle
将导致底层句柄关闭,同时异步保留文件以进行额外检查。这会削弱操作系统对调用者做出的许多保证,并且会成为许多错误的根源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)