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

文書翻訳 文書翻訳
文書番号: 320011 - 対象製品
この記事は、以前は次の 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) で最初に修正されました。

プロパティ

文書番号: 320011 - 最終更新日: 2014年2月8日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com