Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以最少的锁定量访问文件_C#_File_Locking_Io - Fatal编程技术网

C# 如何以最少的锁定量访问文件

C# 如何以最少的锁定量访问文件,c#,file,locking,io,C#,File,Locking,Io,在我的应用程序(c#3.5)中,有许多进程非常频繁地访问单个xml文件(读写)。访问该文件的代码被放置在一个由许多其他应用程序引用的程序集中。例如,windows服务可能实例化MyFileReaderWriter类(位于前面提到的程序集中),并使用此类的读/写方法 我正在寻找最好/最快的方法来读取和创建/附加文件,并且锁定量最少。缓存文件数据并定期刷新新内容不是一个选项,因为数据至关重要 我忘了提到我目前使用XDocument(LInq2Xml基础设施)来读取/写入文件内容。首先,确保通过单个实

在我的应用程序(c#3.5)中,有许多进程非常频繁地访问单个xml文件(读写)。访问该文件的代码被放置在一个由许多其他应用程序引用的程序集中。例如,windows服务可能实例化MyFileReaderWriter类(位于前面提到的程序集中),并使用此类的读/写方法

我正在寻找最好/最快的方法来读取和创建/附加文件,并且锁定量最少。缓存文件数据并定期刷新新内容不是一个选项,因为数据至关重要


我忘了提到我目前使用XDocument(LInq2Xml基础设施)来读取/写入文件内容。

首先,确保通过单个实例完成对XML文档的所有访问


然后在访问该功能的功能开始处放置一个锁定机制(等待解锁),并在最后解锁。

数据至关重要是什么意思?XML文件不是您的应用程序专用的吗

锁定对文件的IO访问的简单方法(可能足够好)是创建一个静态工厂类,该类提供一个“读写令牌”对象,每个I/O操作都必须锁定该对象

public static object GetReadWriteToken(String fileName)
{
    //use a hashtable to retreive an object, with filename as key
    return token;
}
在阅读和写作时,只需这样做:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}

如果通过编写您只是在文档中添加附件,请尝试以下操作

基本上,xml文档是一个带有开始和结束标记的shell。标记之间是一个包含引用,该引用引用了另一个文件,该另一个文件是xml文档的主体。 对于写入操作,这要快很多倍,因为您不必每次写入xml文件时都加载它,而且每次也不必写入整个文件

使用XmlWriter类,您可以非常轻松地将节点附加到主体文件的末尾

当其他人想要读取xml时,他们只需打开文档,他们的xml解析器“知道”加载和解析这两个文件


希望这能有所帮助。

几天前我遇到了类似的“情况”,期待着一些答案:)想想看,这不是一个编程设计问题吗?即使实际的磁盘IO不是问题,风险也在于一个线程获得文件锁,读取文件,执行其他操作,然后返回,写入结果并释放锁。同时,所有其他线程都被阻止。您不能使用DB有什么原因吗?@biozin:将有多个进程访问该文件,但一个进程中不会有多个线程。就我而言,这不是一个多线程问题,而是一个“控制文件访问”问题。@NM:是的,很遗憾,我不能使用数据库有各种原因。它必须是一个xml文件。