代码之家  ›  专栏  ›  技术社区  ›  Carson63000

在单独的线程中使用xmlWriter.create()和xmlDocument.load()处理IOExceptions

  •  3
  • Carson63000  · 技术社区  · 14 年前

    我继承了一些代码,其中包括一个将数据(从外部源获取)写入XML文件的计划任务,以及一个读取所述XML文件以获取要向访问者显示的信息的网站。

    不存在同步,而且不用说,有时计划的任务无法写入文件,因为它当前正在打开以供读取。

    作者代码的核心是:

    XmlWriter writer = XmlWriter.Create(fileName);
    try
    {
      xmldata.WriteTo(writer);
    }
    finally
    {
      writer.Close();
    }
    

    读者代码的核心是:

    XmlDocument theDocument = new XmlDocument();
    theDocument.Load(filename);
    

    (是,两端无异常处理)

    我不知道如何最好地同步这些内容。据我所知,xmlWriter.create()和xmlDocument.load()都不接受有关文件访问模式的任何参数。我应该自己管理底层的文件流(使用适当的访问模式)并使用接受流参数的.create()和.load()重载吗?

    或者我应该捕获IOExceptions并执行某种“捕获,等待几秒钟,重试”方法吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   jrista    14 年前

    如果您的网站不需要写回加载的XML文档,我将通过 FileStream 那有 FileShare.ReadWrite 集合。这应该允许另一个线程中的XML编写器写入该文件。

    如果这不起作用,您还可以尝试将XML从文件流读取到memorystream中,并尽快关闭该文件。我仍然会用fileshare.readwrite打开文件,但这会将您的读卡器访问文件中数据所需的时间最小化。

    通过使用 文件共享.readwrite (或) FileShare.Write 对于这一点),作为共享模式,在您仍在阅读文档时,您将面临更新文档的风险。这可能会导致XML内容无效,从而阻止XmlDocument.Load调用成功分析它。如果希望避免这种情况,可以尝试与临时“锁定文件”同步。您不允许文件共享,而是阻止任一线程同时访问,并且当其中一个线程正在处理该文件时,将一个空的临时文件写入磁盘,以表明这一点。处理(读或写)完成后,删除临时文件。这可以防止在任何一端引发异常,并允许您同步对文件的访问。

    还有一些其他的选择,你也可以使用。您可以简单地让两端接受任何异常,并在再次尝试之前等待一小段时间,尽管这不是真正的最佳设计。如果您足够了解.NET的线程选项,那么也可以使用命名系统 Mutex 这两个过程(你的写作过程和你的网站过程)都知道。然后您可以使用互斥锁来锁定,而不必为锁定文件而烦恼。