【问题标题】:How to access a file with the least amount of locking如何以最少的锁定访问文件
【发布时间】:2010-09-18 18:29:17
【问题描述】:

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

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

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

【问题讨论】:

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

标签: c# file locking io


【解决方案1】:

如果你只是在文档中添加内容,那么试试这个

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

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你的意思是数据很关键?您的应用程序不是专门使用 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
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多