3

1 人のユーザー の 2 つのスレッドが同時にコードの一部にアクセスするのをブロックするために、 lock("on some object")したいと思い ます。2 つの異なるセッションを持つ 2 つの異なるユーザーがそれを行うことができます。セッションの処理にFormsAuthenticationを使用しています。ロックにはどのようなオブジェクトを使用できますか? このクラス (FormsAuthentication) は、セッションごとにある種のシングルトンを提供しますか?それとも、それを行うための他のトリックを知っていますか?

オブジェクトのセットで辞書を非表示にするシングルトンを処理することを考えています(開いているさまざまなセッションのロックのセットとして)。しかし、コードを理解しにくくするような複雑なクラスを開始する前に、それを行うための最善かつ簡単な方法を忘れているのでしょうか?

シングルセッションでそのロックを行うためのより良いトリックを知っていますか?

4

1 に答える 1

2

ブロックする単一のセッションに固有の文字列を作成できる場合は、 Named Mutexを使用できます。

ミューテックスを作成した後、スレッドはWaitOne()ミューテックスを取得するために呼び出すことができます (それにより、その後 `WaitOne()) を呼び出す他のスレッドをブロックします)。

次に、スレッドを呼び出しReleaseMutex()て解放し、待機中の別のスレッドWaitOne()が続行できるようにします。

コンソール アプリのサンプル コード:

string mutexName = "Some name unique to the session";

bool created;
Console.WriteLine("Press RETURN to create mutex.");
Console.ReadLine();

using (var mutex = new Mutex(initiallyOwned:false, name:mutexName, createdNew: out created))
{
    Console.WriteLine("Attempting to enter mutex");
    mutex.WaitOne();
    Console.WriteLine("Got mutex. Press RETURN to release.");
    Console.ReadLine();
    mutex.ReleaseMutex();
    Console.WriteLine("Released mutex. Press RETURN to exit.");
    Console.ReadLine();
}

これはプロセス間でも機能することに注意してください。オペレーティング システムのイベント ハンドルを使い果たすため、何百ものセッションがある場合はやり過ぎになる可能性があります。また、Marc が後述するように、「スティッキー」負荷分散を想定しています。

于 2013-11-18T13:21:20.773 に答える