gpt4 book ai didi

.net - 在高负载的 .ashx http 处理程序中将记录附加到磁盘文件的最快、最安全的方法是什么?

转载 作者:行者123 更新时间:2023-12-02 13:44:18 24 4
gpt4 key购买 nike

在 .net4 IIS7 的高度并行 Web 环境中将记录写入(附加)文件的最佳选项是什么?我使用 ashx http 处理程序来接收应快速写入文件的小部分数据。首先我使用:

    using (var stream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 8192))
{
stream.Write(buffer, 0, buffer.Length);
}

但我注意到一些记录已损坏或不完整,可能是因为 FileShare.ReadWrite。接下来我尝试将其更改为 FileShare.Read。那里没有损坏的记录,但时不时地我会得到这个异常:System.IO.IOException:该进程无法访问该文件...因为它正在被另一个进程使用。

理想情况下,我希望操作系统对并发写入请求进行排队,以便最终写入所有记录。我应该使用什么文件访问 API?

最佳答案

有两个选项,具体取决于大小。如果大小很小,可能最好的选择是简单地通过某些共享锁来同步对文件的访问。如果可能的话,保持文件打开(偶尔刷新)而不是不断地打开/关闭也是一个好主意。例如:

class MeaningfulName : IDisposable {
FileStream file;
readonly object syncLock = new object();
public MeaningfulName(string path) {
file = new FileStream(fileName, FileMode.Append, FileAccess.Write,
FileShare.ReadWrite, 8192);
}
public void Dispose() {
if(file != null) {
file.Dispose();
file = null;
}
}
public void Append(byte[] buffer) {
if(file == null) throw new ObjectDisposedException(GetType().Name);
lock(syncLock) { // only 1 thread can be appending at a time
file.Write(buffer, 0, buffer.Length);
file.Flush();
}
}
}

这是线程安全的,并且可以毫无问题地提供给所有 ashx。

但是,对于较大的数据,您可能需要查看同步的读写器队列 - 即所有写入器(ashx命中)都可以将数据扔到队列中,并使用单个专用写入器线程将它们出列并附加。这会消除 ashx 的 IO 时间,但是您可能希望限制队列大小,以防编写器跟不上。这里有一个 capped synchronized reader/writer queue 的示例.

关于.net - 在高负载的 .ashx http 处理程序中将记录附加到磁盘文件的最快、最安全的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com