かなり奇妙な問題を見つけましたが、その理由がわかりません。私の当初の意図は、コンソールアプリケーションの複数のインスタンスが開かないようにミューテックスを使用することでした。そのために私はこのようなものを持っていました:
[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();
}
}
その後、これは期待どおりに機能し、単一のインスタンスのみが許可されます。
私が興味を持っているのは、2番目のコードブロックが最初のコードブロックよりも機能する理由です。私が理解している限り、どちらも同じように機能するはずですが、そうではないように見えます。明らかな何かが欠けていますか?