我发现了一个相当奇怪的问题,我不明白为什么。我的初衷是使用互斥锁来防止打开控制台应用程序的多个实例。为此,我有这样的事情:
[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();
}
}
然后这可以按预期工作,并且只允许一个实例。
我感兴趣的是为什么第二个代码块在第一个代码块上工作,据我所知,它们应该都可以工作,但它们似乎没有。我错过了一些明显的东西吗?