4

したがって、これは、コードの最後にGC.KeepAliveを配置して、ミューテックスを開いたままにする必要があることを示しています(ミューテックスの早期のGC廃棄が原因でアプリの複数のインスタンスが発生するのを防ぐため)。しかし、KeepAliveをfinallyブロックに配置する必要がありますか、それともtryブロックの最後に配置する必要がありますか?

4

1 に答える 1

5

私は個人的にそのアプローチを使用しません。

問題は、アプリケーションコード(この場合はフォーム)の完了後にミューテックスを使用する必要があることです。そうしないと、GCの最適化後の候補になります。

MutexはIDisposableを実装しているため、これを同じように簡単に行うことができます。

[STAThread]
static void Main()                  // args are OK here, of course
{
    bool ok;
    using(var mutex = new System.Threading.Mutex(true, "YourNameHere", out ok))
    {
        if (!ok)
        {
            MessageBox.Show("Another instance is already running.");
            return;
        }

        Application.Run(new Form1());
    }
}

これは、usingステートメントによって最終的に作成されたミューテックスがGC候補になるのを防ぐため、同様に機能します。私は個人的に、このより混乱が少なく、よりクリーンなコードを見つけました。

そうは言っても、そのリンクからのアプローチをたどりたい場合は、KeepAliveをどこかに置くだけで、ミューテックスが収集されず、問題が発生しなくなります。メインアプリケーションコードが「完了」した後であれば、tryまたはfinallyブロック内に配置できます。これを無視して、明示的Dispose()にミューテックスを使用することもできます。ミューテックスを何らかの方法で使用する限り、問題はありません。

于 2010-10-06T00:04:24.160 に答える