-1

我遇到了问题,需要帮助。我需要保存一个 XML 文件,大约 400MB。我正在使用System.Xml.Linq.XDocument.Save()这个。通常没问题,但有时我有一个奇怪的行为,System.Xml.Linq.XDocument.Save()确实将 XML 数据保存在同一个 XML 中的无限循环中,直到硬盘驱动器耗尽。再次使用相同的 XML 数据,没有问题,一切正常。所以直到现在,重现这种行为是不可能的!

我有一个新服务器,现在这是我得到的唯一结果,每次调用 System.Xml.Linq.XDocument.Save() !它是绝对可重现的……这是新环境

  • .Net Framework 4(也是 4.5)
  • Windows Server 2008 R2 标准版 SP1
  • 32 GB 内存
  • 64 位
  • 已安装所有更新

感谢帮助!


这是代码片段:

xmlImp = new XDocument(
    new XDeclaration("1.0", null, null),
    new XDocumentType("Hotelstamm", null, "hotel.dtd", null),
    HotelStamm);

string pathUTF8 = path.Replace(".xml", "-utf8.xml");
try 
{ 
    xmlImp.Save(pathUTF8);
} 
catch (IOException) 
{
} 

编辑:

问题是我们在多个线程中创建了 Xml-Structure,而 XElement 的 .Add-Method 不是线程安全的。如果在多个线程中调用它会损坏 Xml-Stucture 并且 Xml 开始变得无限。

问题是应用程序在我们的旧服务器上运行良好,大约 95%。但在新的上它只有 5% 的机会成功。
在旧服务器上,一个带有 3 次尝试的 sinpmle 循环使其工作。但是现在锁定它可以正常工作。

4

1 回答 1

2

重新检查代码,我注意到您正在使用XDocument ctor 的此重载

如果HotelStamm传递给构造函数的 , 变量包含复杂的循环关系,则它可能无法在分层 XML 中进行有限表示。

您可以尝试枚举xmlImp.Descendants()并查看是否获得相同的比赛行为。

如果是这样,您需要简化有问题的周期性关系。请注意,这与运行代码的机器的规格没有直接关系。

于 2013-06-28T08:31:43.020 回答