Console Mutex Quirks
本文关键字:Quirks Mutex Console | 更新日期: 2023-09-27 18:00:33
我发现了一个相当奇怪的问题,我不明白为什么。我的初衷是使用互斥锁来防止控制台应用程序的多个实例打开。为此,我有了这样的东西:
[STAThread]
static void Main(string[] args)
{
// Attempt to create mutex
Mutex mutex = new Mutex(true,MUTEX_NAME);
try {
if (!mutex.WaitOne(0,true)) return;
...
} finally {
// Close mutex
mutex.Close();
}
// If debugging, allow for read-key pause
#if DEBUG
Console.ReadKey();
#endif
}
我预计,如果它不能等待互斥,它将立即从Main()
方法返回,同时尊重finally块。
然而,我似乎可以用这段代码运行多个实例,它总是可以等待互斥对象,而我总是在ReadKey()
点结束。
但是,如果我将代码更改为:
[STAThread]
static void Main(string[] args)
{
// Attempt to create mutex
Mutex mutex = new Mutex(true,MUTEX_NAME);
try {
if (!mutex.WaitOne(0,true)) return;
...
// If debugging, allow for read-key pause
#if DEBUG
Console.ReadKey();
#endif
} finally {
// Close mutex
mutex.Close();
}
}
然后,这将按预期工作,并且只允许使用单个实例。
我感兴趣的是,为什么第二个代码块比第一个代码块有效,据我所知,它们应该都一样,但它们看起来不一样。我是不是错过了一些明显的东西?
在您的第一个示例中,创建互斥体,等待它,它会立即返回,然后继续销毁它,然后等待按键。由于您销毁了互斥锁,下一个实例将找不到它,并将重新创建它。
在第二个示例中,您在等待按键的同时保持互斥,从而阻止第二个实例启动。