2011-07-11 5 views
4

環境: 3異なるWebアプリケーションプール内の1つのWebサービス2。私は本当にこのものをロックしていますか?

スレッドセーフではないものにアクセスしようとするコードは、すべて同じコードであり、書き込み先のファイルと同じです。

このコードは、各Webサービスで同じ方法でロックしてください。ロックのキーワードが私の望むことをしているかどうかはわかりません。私がしよう

つのロックは、各Webサービスでこれです:

string stringValue 
lock (stringValue) 

私がしようと、他のロックがある:

lock (typeof(MyWebServiceClass)) 

それがである一方、これらのロックは、ファイルへの同時書き込みを防ぐことができますつかいます?この場合、これらのWebサービスのそれぞれに複数のクライアントが当たっています。

+0

は、すべて単一のサーバー上で実行されているWebサービスはありますか? – mbeckish

答えて

10

あなたがMutexという名前のアプリケーションプール/プロセス間でロックする必要があります。

C#lockキーワードはMonitor.Enter()ため、Monitor.Exit()方法はtry/finallyブロックで呼び出すシンタックスシュガーです。 Monitorは、インプロセスロック用の軽量(完全に管理された)同期プリミティブです。

一方Mutexは(同じマシン上のプロセス間で)ローカルまたはグローバルのいずれかであることができる - また名前ミューテックスというグローバルミューテックスは、オペレーティング・システム全体に表示され、そして内のスレッドを同期させるために使用することができます複数のアプリケーションドメインまたはプロセス。また、MSDNを参照してください。

2

あなたはMutexを使用してAppDomainsをロックする必要があると思います。

また、その価値については、あるタイプのロックを避けてください。最初のロックが取得された後に他の場所のコードがロックしようとすると、デッドロックが発生することがよくあります。ロックの役割を果たすことだけを目的とするオブジェクトをロックすることが最善です。例えば

object padlock; 

lock(padlock) 
{ 
    // work here 
} 
関連する問題