2

XMLファイルを使用して値を保存しています。このXMLファイルには、複数の方法からアクセスできます。

Private object lockObject = new object() 
Method1
 {
    Lock(this.lockObject)  
  {
      MyCommonMethod()  
  }
 } 
Timer.ElapseEvent 
{  
  Lock(this.lockObject)  
  {    
  MyCommonMethod()  
  } 
} 


   MyCommonMethod()
     {  
 // Read/Write to XML file.  
 var element = XElement.Load(path);  
 // some operations  

   element.save(path) 
} 

現在、このクラスは複数のプロジェクト(サービス)によって使用されており、それらは1つのプロジェクトに結合されています。

クラスでSTATICロックオブジェクトを使用できますか?この場合、異なるプロセスで機能しますか?

そのため、ファイルを同時に使用している可能性があり、LOCKを保持しているにもかかわらず、別のスレッドがファイルを所有しているというエラーが発生することがあります。

このシナリオで最善の解決策は何でしょうか?ご案内ください。


このリンクはどうですか...

ファイルが使用されているかどうかを確認する方法はありますか?

これが最善の方法ですか、それともMutexを使用する必要がありますか?

案内してください。

4

2 に答える 2

3

「異なるアプリ ドメイン」の問題ではなく、「異なるプロセス」の問題のようです。とにかく、 mutexのような厳密な同期ソリューションを適用できます。

mutex.WaitOne();
MyCommonMethod();
mutex.ReleaseMutex();

また、C# 4.0 を使用している場合は、この目的でメモリ マップト I/Oを使用できます。

于 2012-04-06T05:55:34.970 に答える
2

静的変数は、異なるプロセス間で共有されません。

次のいずれかを実行できます。

  1. ファイル自体をロックする ( FileShare.NoneFileStream コンストラクターに渡し、そのストリームを使用して XML を読み取る)、または
  2. グローバルミューテックスを使用します(空でない名前Mutex コンストラクターに渡します)。

オプション (1) は、ファイルが既にロックされている場合はブロックしません (すぐに例外をスローします) 。ブロック動作をエミュレートする場合は、ファイルを繰り返し「ポーリング」する必要があります。一方、オプション (2) は、アプリケーションがファイルにアクセスする唯一のアプリケーションである場合にのみ機能します。あなたの毒を選んでください。

于 2012-04-10T05:22:46.947 に答える