2017-08-14 10 views
0

MSDNによると、XmlSchemaSetクラスはスレッドセーフであるとは限りません。XmlSchemaSetは複数のXmlReader/XmlWriterオブジェクト間で共有できますか?

だから、複数のXmlReaderオブジェクトが1つのXmlSchemaSetオブジェクトを参照する単一​​のオブジェクトを使用して作成することができ、複数のスレッドから同時に使用しますか?つまり、新しい文書をバックグラウンドで処理する必要があるたびに、新しい​​オブジェクトを作成し、XmlSchemaSetという新しいコピーを割り当てる必要があるということですか?

このように見えるのは非常に無駄でしょう。特にXmlSchemaSetは、新しいドキュメントごとにスキーマを再コンパイルする必要があるためです。

XmlWriterオブジェクトの回答は同じですか?

もちろん、私はXmlSchemaSetオブジェクトを最初に移入した後に変更しません。最初に使用する前にCompileメソッドを呼び出すこともできます。その後、と思われますが、読み取りのみが実行されるためすべてが安全でなければなりませんが、わかりません。

+0

@ mjwills申し訳ありませんが、私はコンピュータから離れていました。はい、どちらの答えでも私が恐れていたことを確認できます。多分、マルチリーダ、ゼロライターのシナリオがうまくいくかもしれませんが、これに頼らないでください。今、受け入れられたものとしてマークするものを決めるために... –

答えて

2

スレッドセーフではないと言えば(契約上)、共有/並行して使用することはできません。

が動作する可能性があります。しかし、Microsoftは、が動作することを保証していないことを明示している()。したがって、現在動作していても、次回に.NET Frameworkをアップグレードすると(たとえば)動作しない可能性があります。

スレッドセーフではありませんhttp://referencesource.microsoft.com/#System.Xml/System/Xml/Schema/XmlSchemaSet.cs(例えばHashtable)で、他のタイプの使用は、私は強くスレッド間XmlSchemaSetを使用しないことをお勧めします意味します。 XmlSchemaSet複数のスレッド間でを使用すると、(Hashtableは、例えば、複数のリーダーをサポートしているので)あなただけのを読んでいる場合 OKかもしれ - しかし、複数のスレッド間で作業XmlSchemaSetは(それが今日の仕事をしていても)永久保証されていません。

2

現在のバージョンは100%ではありませんが、.NETの初めにはこの問題に遭遇しました。 XmlSchemaをコンパイルすると、おそらくそれが変更されます(コンパイル後の情報が追加されます)。すでにコンパイルされているものに対して検証することはほとんどありませんが、この点に頼ることはできません。

これまで通りに対処する方法は、シングルトンをクラス内に保ち、そのシンクにアクセスを同期する(新しいスキーマを常に作成する代わりに)方法です。つまり、直接的または間接的に参照を渡すことはありません(たとえば、XmlReader)。

通常、XMLをXDocumentなどにロードする静的サービスメソッドを記述します。

+0

私は、他のスレッドに設定されたスキーマを渡す前にコンパイルすると言っていた理由を、状態を変更するコンパイルを知っています。私はあなたの提案がどのように問題を回避するのか理解していません。シングルトンクラスまたは静的クラスでは、XmlSchemaSetのコピーを作成し、呼び出しごとに再コンパイルするか、スレッド間でアクセスを同期させる必要があります。したがって、余分な計算を追加するか、同時実行性を失うことになります。これは、複数のスレッドを使用する際の重要なポイントです。 –

+1

私は、XML構文解析に関してアクセスを同期させて同時実行を失うことを意味しました。 'XDocument'です。 – tinudu

関連する問題