-1

問題があり、助けが必要です。約 400MB の XML ファイルを保存する必要があります。これに使っSystem.Xml.Linq.XDocument.Save()ています。System.Xml.Linq.XDocument.Save()通常は問題ありませんが、ハードドライブがいっぱいになるまで、同じ XML の無限ループで XML データを保存するという奇妙な動作が時々発生します。同じ XML-Data をもう一度取得すると、問題はなく、すべて正常に動作します。そのため、今までこの動作を再現することはできませんでした。

私は新しいサーバーを手に入れましたが、System.Xml.Linq.XDocument.Save() が呼び出されるたびに得られる唯一の結果です! 完全に再現可能です...これが新しい環境です

  • .Net Framework 4 (4.5 も)
  • Windows Server 2008 R2 標準 SP1
  • 32GB ラム
  • 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 構造が破損し、Xml が無限になり始めます。

問題は、アプリケーションが古いサーバーで約 95% 正常に動作することでした。しかし、新しいものでは、成功する可能性は 5% しかありませんでした。
古いサーバーでは、3回の試行でsinpmleループが機能しました。しかし、今ではロックを使用すると正常に動作します。

4

1 に答える 1

2

コードを再検討すると、XDocument ctor のこのオーバーロードを使用していることに気付きました。

コンストラクターに渡す , 変数に複雑な循環関係が含まれている場合HotelStamm、階層 XML で有限表現できない可能性があります。

列挙xmlImp.Descendants()してみて、同じレース動作が得られるかどうかを確認できます。

もしそうなら、単純化する必要のある問題のある循環関係があります。これは、コードが実行されるマシンの仕様とは直接関係がないことに注意してください。

于 2013-06-28T08:31:43.020 に答える