多个线程同时写入多个文件 - 它正被另一个进程使用
Posted
技术标签:
【中文标题】多个线程同时写入多个文件 - 它正被另一个进程使用【英文标题】:Multiple threads writes multiple files same time - it is being used by another process 【发布时间】:2020-10-03 22:16:23 【问题描述】:在我们的 WCF 服务中,客户端可以上传文件块。几个客户端上传文件,一些客户端在多个线程上上传。为了在服务器端序列化文件访问,我们创建了一个字典来锁定给定的文件访问。当一个线程想要访问一个文件进行写入时 - 检查这个字典是否包含给定的文件名。如果它包含 - 它表明一个线程当前正在访问该文件。为了释放锁,我们简单地从字典中删除文件名。
公共类 FileUploader private static readonly Dictionary FileStreams = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
public void SaveChunk(String storagePath, File file, Int64 currentPos, Byte[] chunk)
using (var writer = new BinaryWriter(OpenFileStream(storagePath)))
try
SaveChunk(writer, currentPos, chunk);
finally
writer.Close();
RemoveLock(storagePath);
private Stream OpenFileStream(String fullFileName)
Stream result = null;
lock (FileStreams)
while (FileStreams.ContainsKey(fullFileName))
Monitor.Wait(FileStreams);
result = System.IO.File.Open(fullFileName, FileMode.OpenOrCreate, FileAccess.Write);
FileStreams[fullFileName] = true;
return result;
private void RemoveLock(String fileName)
lock (FileStreams)
FileStreams.Remove(fileName);
Monitor.Pulse(FileStreams);
不知何故,我们 spmetime 收到了一条错误消息:
进程无法访问文件 '\ourstorage\folder\a_file_name.zip' 因为它正被另一个进程使用。 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
但我们不明白为什么。似乎代码是正确的,并且不会同时访问两个线程相同的文件。任何想法?
【问题讨论】:
最有可能的候选者是防病毒软件,或者您正在运行多个进程(即网络农场或网络花园)。 谢谢。这段代码运行了好几年,只出现了几周的错误消息。可能已更改防病毒行为。我的责任只是代码。 您在经营网络农场还是网络花园? 没有。只有一个 WCF 服务正在运行,并完成这项工作。 【参考方案1】:您在同一个文件中使用不同的线程进行编写。如果您已经在此文件中写入,则必须检查每个线程。
【讨论】:
我愿意。这就是我使用 Monitor 和 lock 的原因。或者你是什么意思?以上是关于多个线程同时写入多个文件 - 它正被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章
该进程无法访问该文件,因为它正被另一个进程 Streamwriter 使用
dotnet publish 错误:该进程无法访问该文件,因为它正被另一个进程使用
System.IO.IOException: '该进程无法访问该文件,因为它正被另一个进程使用