[FIX] マルチスレッド環境下で XslTransform を使用すると System.InvalidOperationException が発生する

この記事は、以前は次の ID で公開されていました: JP320011
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
System.Xml.Xsl 名前空間の XslTransform オブジェクトを複数のスレッド間で共有すると、アプリケーションをビルドするときに以下のエラー メッセージが表示されることがあります。
System.InvalidOperationException: コレクションが変更されました。列挙操作は実行されない可能性があります。
コール スタックは次のようになります。
at System.Collections.ArrayListEnumeratorSimple.MoveNext()    at System.Xml.XPath.XsltFunction.SetXsltContext(XsltContext context)    at System.Xml.XPath.CompiledXpathExpr.SetContext(XmlNamespaceManager nsManager)    at System.Xml.Xsl.Processor.GetValueQuery(Int32 key)    at System.Xml.Xsl.Processor.ValueOf(ActionFrame context, Int32 key)    at System.Xml.Xsl.ValueOfAction.Execute(Processor processor, ActionFrame frame)    at System.Xml.Xsl.ActionFrame.Execute(Processor processor)    at System.Xml.Xsl.Processor.Execute()    at System.Xml.Xsl.XslTransform.Transform(IXPathNavigable input,XsltArgumentList args, TextWriter output)				
この問題は、現時点ではプロセッサが複数あるコンピュータでのみ発生することが確認されていますが、シングル プロセッサ コンピュータでも発生する可能性があります。
原因
この問題は、System.Xml.dll アセンブリの不具合が原因で発生します。
解決方法
この問題を解決するには、Microsoft .NET Framework の最新の Service Pack を入手します。関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
318836 最新の .NET Framework 1.0 Service Pack の入手方法
: SP1 適用済みの Microsoft .NET Framework が既にインストールされているシステムにこの修正を適用してください。

修正プログラム (英語版) の属性は次のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。
   日付             バージョン        サイズ              ファイル名   -------------------------------------------------------------   03-APR-2002   1.0.3705.223   1,294,336 バイト   System.Xml.dll					

回避策

この問題を回避するには、lock ステートメント (Microsoft Visual C# .NET の場合) または SyncLock...End SyncLock ブロック (Microsoft Visual Basic .NET の場合) を使用することによって、Transform メソッドを使用する箇所を保護します。ただし、この回避策を実行すると、アプリケーションの設計と目的によっては、容認できないパフォーマンスの低下が生じることがあります。

この他に、N+1 個の XslTransform オブジェクトのプールまたはキャッシュを実装するソリューションを作成する回避策を使用することによって、より良いパフォーマンスを得られる場合があります。N はコンピュータのプロセッサ数です。
状況
マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。 この問題は、Microsoft .NET Framework Service Pack 2 (SP2) で最初に修正されました。
multi threaded multiproc proc exception managed
プロパティ

文書番号:320011 - 最終更新日: 02/08/2014 16:20:24 - リビジョン: 3.1

  • Microsoft .NET Framework Service Pack 1
  • Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2
  • kbnosurvey kbarchive kbhotfixserver kbqfe kbbug kbfix kbnetframe100presp2fix kbnetframe100sp2fix KB320011
フィードバック