質問
私のアプリケーション(c#3.5)では、単一のxmlファイル(読み取りおよび書き込み)に非常に頻繁にアクセスするさまざまなプロセスがあります。ファイルにアクセスするコードは、他の多くのアプリケーションによって参照されるアセンブリに配置されます。たとえば、WindowsサービスはMyFileReaderWriterクラス(前述のアセンブリにある)をインスタンス化し、このクラスの読み取り/書き込みメソッドを使用します。
ロックを最小限に抑えてファイルを読み取り、作成/追加するための最良/最速の方法を探しています。ファイルデータをキャッシュし、定期的に新しいコンテンツをフラッシュすることは、データが重要であるため、オプションではありません。
ファイルのコンテンツの読み取り/書き込みに現在XDocument(LInq2Xmlインフラストラクチャ)を使用していることを忘れていました。
解決
最初に、XMLドキュメントへのすべてのアクセスが単一のインスタンスを介して行われることを確認します。
次に、アクセスする関数の最初にロック機構(ロック解除を待つ)を配置し、最後にロック解除します。
他のヒント
文書に追加するだけの場合は、これを試してください
http://msdn.microsoft.com/en-us/library /aa302289.aspx
基本的に、XMLドキュメントは開始タグと終了タグを持つシェルです。タグの間には、別のファイルを参照するinclude参照があります。この別のファイルは、xmlドキュメントの本文です。 書き込み操作の場合、書き込みのたびにxmlファイルをロードする必要がなく、毎回ファイル全体を書き込む必要がないため、これは何倍も高速です。
XmlWriterクラスを使用すると、非常に簡単にノードを本文ファイルの最後に追加できます。
他の人がxmlを読みたい場合、彼らは単にドキュメントを開き、そのxmlパーサーは「知っています」;両方のファイルをロードして解析します。
これがお役に立てば幸いです。
データが重要であるとはどういう意味ですか? XMLファイルはアプリケーションでのみ使用されますか?
ファイルへのIOアクセスをロックする簡単な(そしておそらく十分な)方法は、「読み取り書き込みトークン」を提供する静的ファクトリクラスを作成することです。各I / O操作でロックをオンにする必要があるオブジェクト。
public static object GetReadWriteToken(String fileName)
{
//use a hashtable to retreive an object, with filename as key
return token;
}
そして単に読み書き中にこれを行う:
lock(GetReadWriteToken(@"C:\important.xml"))
{
//io code
}