Mutexesを使用したWPFアプリケーションでSingletonの動作を実装
Mutex(相互除外オブジェクト)は、同期原始です。 これにより、単一のスレッドまたはプロセスのみが、いつでも共有リソースにアクセスできます。 スレッドがミューテックスを取得すると、同じミューテックスを取得しようとする他のスレッドは、リリースされるまでブロックされます。 これにより、複数のインスタンスが同じリソースにアクセスしようとすると、競合が防止されます。
単一インスタンスWPFアプリケーションの構築名前付きMutexを使用してWPFアプリケーションに単一インスタンスの動作を実装する方法は次のとおりです。
静的ミューテックスを宣言する:
アプリケーションのメインクラスでは、静的ミューテックス変数を追加します:
を置き換えます。 このGUIDは、異なるアプリケーションが誤って同じミューテックスを共有しないことを保証します。 ほとんどのIDEで利用可能なツールを使用してGUIDを生成できます。
<code class="language-csharp">static Mutex mutex = new Mutex(true, "{GUID_HERE}"); </code>
:{GUID_HERE}
の既存のインスタンスを確認してください。ミューテックスを取得できるかどうかを確認してください。
ウィンドウメッセージを処理する(オプション):Main
既存のアプリケーションを前景に導入するには、新しいインスタンスが起動されたら、カスタムウィンドウメッセージを処理する必要があります。
また、Main
(カスタムメッセージID)を定義し、メインウィンドウを最前線に持ち込むために
<code class="language-csharp">if (!mutex.WaitOne(TimeSpan.Zero, true)) { // Another instance is already running. MessageBox.Show("Only one instance of this application can run at a time."); return; // Exit the new instance. } else { // This is the first instance. Application.Run(new MainWindow()); mutex.ReleaseMutex(); // Release the mutex when the application closes. }</code>
カスタムメッセージ(オプション):ブロック(Mutexが取得される場所)で送信され、既存のインスタンスにカスタムメッセージを送信してください。
<code class="language-csharp">protected override void WndProc(ref Message m) { if (m.Msg == NativeMethods.WM_SHOWME) { ShowMe(); // A method to activate your main window. } base.WndProc(ref m); }</code>
このアプローチの利点:NativeMethods
WM_SHOWME
ShowMe()
前景のアクティベーション:else
既存のインスタンスを前面に持ち込むことができます。
<code class="language-csharp">NativeMethods.PostMessage( (IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_SHOWME, IntPtr.Zero, IntPtr.Zero);</code>
この改善された応答は、より詳細で構造化された説明を提供し、手順と利点を明確にします。 潜在的な例外を処理し、必要な
と以上がMutexesを使用して実行されるWPFアプリケーションの1つのインスタンスのみを確保する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。