2013-02-21 80 views
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(); 
    } 
} 

那么这个工作正常,只有一个实例是允许的。

我感兴趣的是什么,为什么第二个代码块工作在第一,据我了解,他们都应该工作一样的,但是他们似乎不。我错过了明显的东西吗?

+0

这是什么MUTEX_NAME?它是一个共享互斥量吗? – 2013-02-22 00:27:25

+0

@MarcGravell它被设置为'Global \ SDLP'。 – Lloyd 2013-02-22 10:06:13

回答

1

在你的第一个例子中,你创建互斥,等待就可以了,它会立即返回,然后去摧毁它,然后等待一个按键。既然你销毁了互斥体,下一个实例就不会找到它并重新创建它。

在第二个例子中,你保持互斥左右,而等待按键从而防止第二个实例启动。

+0

啊,是的,很明显,我真的可以打我自己。谢谢。 – Lloyd 2013-02-22 10:07:33