gpt4 book ai didi

asp.net - 在单独的线程中使用 XmlWriter.Create() 和 XmlDocument.Load() 处理 IOExceptions

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:54 25 4
gpt4 key购买 nike

我继承了一些代码,其中涉及将数据(从外部源获取)写入 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() 都不采用任何有关文件访问模式的参数。我是否应该自己管理底层 FileStreams(使用适当的访问模式)并使用采用 Stream 参数的 .Create() 和 .Load() 重载?

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

最佳答案

假设您的网站不需要写回加载的 XmlDocument,我将通过设置了 FileShare.ReadWriteFileStream 加载它。这应该允许另一个线程中的 XmlWriter 写入文件。

如果这不起作用,您还可以尝试将 XML 从 FileStream 读取到 MemoryStream 中,并尽快关闭该文件。我仍然会使用 FileShare.ReadWrite 打开文件,但这会最大限度地减少读者访问文件中数据所需的时间。

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

您还可以使用其他几个选项。您可以简单地让两端吞下任何异常并等待一小段时间再重试,尽管这并不是最好的设计。如果您足够了解 .NET 的线程选项,您还可以使用命名系统 Mutex这两个进程(您的写作进程和您的网站进程)都知道。然后您可以使用 Mutex 进行锁定,而不必为锁定文件而烦恼。

关于asp.net - 在单独的线程中使用 XmlWriter.Create() 和 XmlDocument.Load() 处理 IOExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com