我刚看到这个问题:在C#中对File类使用静态方法是否安全?.总结一下IOException,在这个ASP.NET代码片段中,OP有一个因为文件正在使用:
var text= File.ReadAllText("path-to-file.txt");
// Do something with text
File.WriteAllText("path-to-file.txt");
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是,由于多个ASP.NET重叠请求,这是一个简单的并发访问问题.我要解决的问题是将I/O集中到同步的线程安全类中(或者删除文件以支持其他内容).我读了两个答案,当我即将向其中一个人投票时,我看到那些用户是谁,我想到了什么,并且停止了.
我会引用它们两者(然后请参阅原始答案以获取更多背景信息).
对于这个OP段:
我猜测文件读取操作有时不会在写操作发生之前关闭文件[...]
答案说:
正确.文件系统不支持原子更新[...]使用FileStream没有帮助[...]文件里面没有魔法.它只是为了您的方便而使用FileStream包装.
但是我没有看到任何期望的原子操作(读取+后续写入)和并行(因为部分重叠的多线程请求)可能导致并发访问.即使是原子 I/O操作(读/写)也会有完全相同的问题.OK FileStream 可以是异步的,但它不是如何File.ReadAllText()和File.WriteAllText()使用它.
另一个答案使我更加困惑,它说:
虽然根据文档,该方法保证文件句柄被关闭,但即使引发异常,也不能保证在方法返回之前发生关闭的时间:关闭可以异步完成.
什么?MSDN说方法将打开,读取和关闭文件(如果是异常).这种方法是否有可能异步关闭文件?OS会推迟CloseHandle()吗?在哪些情况下?为什么?
简而言之:它只是一种误解还是CloseHandle()异步?我错过了一些非常重要的东西?
您问题中的前两句话不应该相关。File.*完成后,或者当您关闭文件时FileStream,文件将立即解锁。从来没有任何一种“缠绵”。如果存在,您将永远无法在不重新启动的情况下再次安全地访问同一文件。
可能的答案假设问题中的代码正在并行运行多次。如果不是,那么该代码显然是安全的。
然而,我没有看到任何原子操作的期望......即使是原子 I/O 操作(读 + 写)也会有完全相同的问题。
这是真的。我不知道为什么我在回答中对此做出了声明(不过这是正确的。只是不相关)。
不保证关闭的时间发生在方法返回之前:关闭可以异步完成。
我不知道他为什么这么说,因为在我能想到的任何情况下这都是不正确的。关闭句柄会立即生效。
我认为你对情况的理解是完全准确的。显然,我们的答案不清楚并且有点误导......对此感到抱歉。
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |