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();
    }
}

然后,这将按预期工作,并且只允许使用单个实例。

我感兴趣的是,为什么第二个代码块比第一个代码块有效,据我所知,它们应该都一样,但它们看起来不一样。我是不是错过了一些明显的东西?

Console Mutex Quirks

在您的第一个示例中,创建互斥体,等待它,它会立即返回,然后继续销毁它,然后等待按键。由于您销毁了互斥锁,下一个实例将找不到它,并将重新创建它。

在第二个示例中,您在等待按键的同时保持互斥,从而阻止第二个实例启动。