3

我想 lock("on some object") 阻止单个用户的两个线程同时访问代码的某些部分。具有两个不同会话的两个不同用户可以做到这一点。我正在使用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 回答