c# - 多个线程同时写入多个文件 - 它正被另一个进程使用
问题描述
在我们的 WCF 服务中,客户端可以上传文件块。几个客户端上传文件,一些客户端在多个线程上上传。为了在服务器端序列化文件访问,我们创建了一个字典来锁定给定的文件访问。当一个线程想要访问一个文件进行写入时 - 检查这个字典是否包含给定的文件名。如果它包含 - 它表明一个线程当前正在访问该文件。为了释放锁,我们简单地从字典中删除文件名。
public class 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 错误代码,字符串可能全路径)
但我们不明白为什么。似乎代码是正确的,并且不会同时访问两个线程相同的文件。任何想法?
解决方案
您在同一个文件中使用不同的线程编写。如果您已经在此文件中写入,则必须检查每个线程。
推荐阅读
- flutter - 如何在颤动的列表视图中显示广告?
- tensorflow - 部署我通过 Colab Google 创建的 Tiny ML 模型
- c# - 如何使用 PrincipalContext 将用户添加到 Active Directory 中的组
- email - 将调查中的电子邮件发送到odoo12中的电子邮件列表时重新加载错误
- python - python webdriver_manager chrome 自定义配置文件
- javascript - 如何在 App Center 崩溃报告中查看未缩小的 React Native JS 调用?
- javascript - 将 vue.js 应用程序中的本地脚本注入不同的组件
- python - 烧瓶形式 current_user NoneType
- node.js - 我如何使用 react js 进行支付 paytm 我已经在 spring boot 中构建了 api
- java - 比较 Spring Mysql 中的 2 个值