使用什么对象来锁定签名会话中的线程(来自单个连接的用户)



我想锁定("在某个对象上")以阻止单个用户的两个线程同时访问代码的某些部分。具有两个不同会话的两个不同用户可以执行此操作。我正在使用表单身份验证来处理会话。我可以用什么样的物体来锁?此类 (FormsAuthentication) 是否为每个会话提供某种单一实例,或者您是否知道执行此操作的其他技巧?

我正在考虑处理在一组对象上隐藏字典的单例(作为不同打开会话的一组锁)。但是在开始这样一个复杂的类之前,可能会使代码变得难以理解,我是否忘记了一些最好和更简单的方法?

你知道一些更好的技巧来为签名会话做那个锁吗?

如果可以创建对要阻止的单个会话唯一的字符串,则可以使用命名互斥锁。

创建互斥锁后,线程可以调用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 在下面指出的那样,它还假设"粘性"负载平衡。

最新更新