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

その後、これは期待どおりに機能し、単一のインスタンスのみが許可されます。

私が興味を持っているのは、2番目のコードブロックが最初のコードブロックよりも機能する理由です。私が理解している限り、どちらも同じように機能するはずですが、そうではないように見えます。明らかな何かが欠けていますか?

4

1 に答える 1

1

最初の例では、ミューテックスを作成し、それを待ちます。ミューテックスはすぐに戻り、次に破棄して、キーが押されるのを待ちます。ミューテックスを破棄したため、次のインスタンスはミューテックスを検出せず、新しく作成します。

2番目の例では、キーが押されるのを待っている間、ミューテックスを維持して、2番目のインスタンスが起動しないようにします。

于 2013-02-22T00:27:57.957 に答える