0

我发现了一个相当奇怪的问题,我不明白为什么。我的初衷是使用互斥锁来防止打开控制台应用程序的多个实例。为此,我有这样的事情:

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

然后这可以按预期工作,并且只允许一个实例。

我感兴趣的是为什么第二个代码块在第一个代码块上工作,据我所知,它们应该都可以工作,但它们似乎没有。我错过了一些明显的东西吗?

4

1 回答 1

1

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

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

于 2013-02-22T00:27:57.957 回答