如果您可以创建一个对要阻止的单个会话唯一的字符串,则可以使用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 在下面指出的那样,它还假设“粘性”负载平衡。