3

.NET System.Xml.Xsl の MSDN。XslCompiledTransformクラスの状態:

スレッドセーフ

[1] XslCompiledTransform オブジェクトは、読み込まれるとスレッド セーフになります。つまり、Load メソッドが正常に完了した後、Transform メソッドを複数のスレッドから同時に呼び出すことができます。

[2]別のスレッドで Transform メソッドが呼び出されているときに、別のスレッドで Load メソッドが再度呼び出された場合、XslCompiledTransform オブジェクトは、古い状態を使用し続けることによって Transform 呼び出しの実行を終了します。Load メソッドが正常に完了すると、新しい状態が使用されます。

[3]注 Load メソッドは、複数のスレッドから同時に呼び出された場合、スレッド セーフではありません。

段落[1][2]が同じオブジェクト インスタンスで (複数のスレッドで)参照されているLoad()か、呼び出されていることを (かなり) 確信しています。しかし、[3]について、同じインスタンスでの同時実行を意味するのか、それともすべてのインスタンスから同時実行を相互に除外する必要があるのか​​ (それを意味する静的なものがある) を知っている人はいますか?Transform() XslCompiledTransformLoad()Load()

4

1 に答える 1

4

ILSpy のコードを見ると、目に見える静的な同期構造はありません。Load()異なるスレッドから異なるインスタンスを呼び出すことができます。

予想Loadどおり、XSLT コンパイラをインスタンス化し、後で Transform メソッドによって使用される内部オブジェクトにスタイルシートをコンパイルします。これは [1] の説明です: 変換がコンパイルされると、内部オブジェクトが読み取り専用になるため、別のスレッドから呼び出すことができます。

もう一度呼び出すLoadと、内部オブジェクトが再コンパイルされるため、[2] を説明する現在進行中の Transform と同期する必要があります。

異なるスレッドから同時にコンパイラを呼び出すと、最終的な内部変換オブジェクトを構築するための競合が発生します ([3])。異なるインスタンスは独立していますが、それらはすべて独自の内部変換オブジェクトを持ち、Load が呼び出されるたびに新しいコンパイラをインスタンス化します。

于 2014-12-06T11:40:36.603 に答える