2

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

我正在寻找以最少锁定量读取和创建/附加文件的最佳/最快方法。缓存文件数据并定期刷新新内容不是一种选择,因为数据很关键。

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

4

3 回答 3

4

如果通过写作您只是附加到文档,那么试试这个

http://msdn.microsoft.com/en-us/library/aa302289.aspx

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

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

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

希望这可以帮助。

于 2008-10-23T12:25:53.930 回答
3

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

然后在访问它的函数的开头放置一个锁定机制(等待解锁)并在最后解锁它。

于 2008-10-23T11:59:15.670 回答
1

你的意思是数据很关键?您的应用程序不是专门使用 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
}
于 2008-10-23T12:00:42.343 回答