2016-10-27 8 views
3

ランダムなエラーを生成するWebサービスがあり、私はそのエラーを発見したと思います。ファイルの同時読み書きの処理

次のように基本的に、それは常にXmlDocumentにロードされ、その後、設定ファイルを読んでいる:

var config = File.ReadAllText(filename); 
xmlDoc.Load(config); 

しかし、後の時間(多分秒後)設定値のいずれかが更新され、ファイルに

xmlDoc.Save(filename); 

を保存したので、私は今、最初のREAD操作中に(私はちょうど今チェックすることはできませんので、残念ながら元の開発者は、空のtryブロックを追加しました)多くのエラーを経験していると私はそれを読んしようとしているので、それはだと思いますIISから生成された別のプロセスが.Saveパート。私はFile.ReadAllTextがどのように動作し、書き込みロックされたファイルで失敗するかどうかわかりません。

読み取りを確実にするためにこれを処理する最適なソリューションは何ですか?書き込まれる値は単なるカウンタであり、失敗した場合は無視されますが、それは重要ではありませんが、書き込まれた方が好きです。私はそれを別の設定ファイルに入れて、エラーで生きることができると思うが、むしろ単なるファイルだっただろう。

ありがとうございました。それは、ファイルへの書き込みから他のプロセスを妨げるように、ソースを見て、それは、順番にFileAccess.ReadFileShare.Readで開かFileStreamを使用して、内部StreamReaderをどのように使用するかFile.ReadAllText()作品に関するあなたの質問に答えるために

+0

静的オブジェクトにlock()を使用すると、同時に1つのスレッドだけがファイルにアクセスできるようになります。 – Gusman

+0

ありがとうございます。これは、IIS Webサービスで標準的な方法ですが、同時に多数のプロセスを同時に読み書きしたいと仮定していますか?私は私の前提の通り、読書のロックを書いているのでしょうか? –

+0

@gusman OPは異なるスレッドではなく異なるプロセスからの読み込みだと思うので、ロックではなくミューテックスが必要です。 –

答えて

2

あなたは、読み取り、書き込み、および副verser前に完了していることを確認するために、ロックを使用することができます。 Read()は、Write()が完了するのを待つ必要があり、Write()はRead()が完了するのを待たなければなりません。

+0

ありがとう。だから私はそれを行うことを考えていたので、私は読み取り専用と書き込み可能な要素のために私の設定を分ける必要はありません。また、私はそれを取る多くのスレッドを介して動作しますIISのアプリケーションプールは、同時要求を作成するかもしれないと私は読み取りまたはコードで私は単にそれを呼び出すのではなくスレッドの開始を使用して私の設定を書くか? –

+0

はい、それらを分ける必要はありません。また、ロックは設計上スレッドセーフです。また、ロックされたオブジェクトは静的であるため、アプリケーションのライフサイクルを通じて1つのインスタンスのみが存在することに注意してください。スレッド開始もやります –

0

(例えば、あなたのXmlDocument.Save())を入力してReadAllTextが完成します。

一方、あなたのXmlDocument.Save()は最終的にFileStreamFileAccess.WriteFileShare.Readで開か使うので、SaveReadAllText前に開始として、それは限りFile.ReadAllText()を可能にします。

の参照は:https://referencesource.microsoft.com/#mscorlib/system/io/streamreader.cs,a820588d8233a829

https://referencesource.microsoft.com/#System.Xml/System/Xml/Dom/XmlDocument.cs,1db4dba15523d588

+0

タイムアウトを取ってくれてありがとう。 XmlWriterがFileShareを持っているのを見たあなたのリンクを使っている間違った場所を探しています。それが失敗してはならないように、読者と同じものを読んでください。それはコードが私を指している場所です:( –

+0

彼らは 'FileShare.Read'を持っていますが、' XmlDocument.Save() 'は' FileAccess.Write'を持っています。 'ReadAllText'がまだ実行中に開こうとすると非常に多くの書き込み/読み取り/ファイルアクセス/ファイル共有 - それはちょっと混乱します:o) –

関連する問題