2011-08-24 10 views
9

通常、私はこれらの2つのコードをすべて見ています。どちらも私の場合には動作しますが、どちらに固執すべきですか?以下のMutex式のうち、.Netアプリケーションの複数のインスタンスを理想的に防ぐことができ、その違いは何ですか?

ケース1:

bool isNew = false; 
Mutex mutex = new Mutex(true, "MyApp_Mutex", out isNew); 
if (!isNew) 
{ 
    MessageBox.Show("already running.", "Multiple Instances Not Allowed", 
             MessageBoxButtons.OK, 
             MessageBoxIcon.Exclamation); 
    return; 
} 

ケース2:複数のインスタンスを防ぐために、両者の間の理想的な方法です

Mutex mutex = new Mutex(false, "MyApp_Mutex"))    
if (!mutex.WaitOne(0, false)) 
{ 
    MessageBox.Show("already running.", "Multiple Instances Not Allowed", 
             MessageBoxButtons.OK, 
             MessageBoxIcon.Exclamation); 
    return; 
} 
  1. 違いは何ですか?

    //if not return{ 
    mutex.ReleaseMutex(); 
    GC.Collect(); 
    //application.Run(); 
    GC.KeepAlive(mutex); 
    
第二の方法の下で

決して最初と:

  • はまた、私はこれらのようなコードを参照してください。どうしてこんなことに?それとも間違っていたのですか?

    基本的には、使用するパラメータと方法を正しく理解している必要があります。誰かが簡単に細かいことが分かると感謝します。私はmsdnのドキュメントを読んでいるときに半分ではないと理解しています。

  • 答えて

    8

    最初に、OSにミューテックスの作成を依頼しています最初のパラメータinitiallyOwnedによって行われます。 isNewパラメータは、それが新しいミューテックスかどうかを示します。新しいものであれば、あなたはinitiallyOwnedパラメータであなたが求めていたので、あなたはその所有権を持つことが保証されています。新しいもので、あなたが所有しているので、アプリケーションが実行されているインスタンスが他には存在しないことを知っています。これは、すでにミューテックスを作成していて、所有しているからです。

    2番目のケースは基本的には同じですが、少し異なります。それは、作成の所有権を要求していないが、WaitOne呼び出しである。 WaitOneが所有権を要求し、0ミリ秒待機しています。所有権を取得した場合、ケース1と同じ理由で、アプリケーションの他のインスタンスが実行されていることは分かりません。

    私の知る限り、それは重要ではありません。最初はもっと直感的で、少なくとも私にとってはそうです。アプリは、それはそれを所有しているので、それがミューテックスを解放する必要があります完了すると、新しい質問#3

    への答えを追加

    。 .NETはあなたのアプリケーションが終了したときにあなたのためにそれをリリースするでしょうが、それを行うのが良い習慣です。 GC.CollectGC.KeepAliveはガベージコレクションを処理しています。スタートアップを制御するmutexを扱うときにこれらの呼び出しが必要となるようなシナリオは考えられません。ミューテックスは静的であると宣言しているため、常に有効範囲にあり、アプリケーションのライフサイクルでガベージコレクタによって解放されることはありません。

    +0

    ありがとうございます。私はよりエレガントになる最初を見つける.. – nawfal

    +0

    私は質問に追加するもう一つの疑いがあります。あなたがそれを見ることができるなら、大きな助けになるでしょう。 – nawfal

    +0

    はい、あなたは私に論理的に聞こえます。 – nawfal

    3

    これらのステートメントで何が起こっているのかを理解するためには、ミューテックスがどのようなもので、どのように動作するのかを理解する必要があります。私はどんな詳細にも進まないでしょうが、私はあなたにこれを指摘しますreference book。最初のいくつかの章を読んで、Mutexesについてのセクションを読んでください。

    コードの最初のスニペットでのミューテックスの宣言では、isNew boolを使用して、現在のアプリケーションインスタンスが最初に実行されたことを指定し、最初にMutexを作成するインスタンスを指定します。これは、システム全体のミューテックスに対するハンドルがミューテックスを作成してアクセスする最初のものではなかったことを、アプリケーションの各セカンダリ実行に通知できることを意味します。

    次に、ifブロックは、関連付けられたタスクが最初にミューテックスに信号を送るかどうかをチェックし、それに応じて状態を処理します。

    コードの2番目のスニペットは完全に異なります。ミューテックスは、他のタスク(タスクB)が続行できるミューテックスに別のタスク(タスクA)が信号を送るのを待つために、タスク(タスクB)で使用できます。

    WaitOne(secs, releaseConext)方法は、それが別のスレッドによってロックされている場合、ミューテックスはXのための信号応答を送信するのを待つ、と言っています。メソッドがX秒で信号応答を得ない場合は、falseを返し、サンプルコードの場合は、アプリケーションを閉じるために使用されるifブロックを入力します。

    個人的には、コードの最初のスニペットを使用します。私は彼らが両方とも同じ量のオーバーヘッドで動作していると思います。しかし、使用するバージョンを選択する際には、最初の方法を実践の一般的な問題として使用するのに最適な方法と見なします。

    +0

    すばらしい説明! – nawfal

    +0

    質問に追加する質問がもう1つあります。 – nawfal

    +0

    申し訳ありませんが、C.C.G.の前に更新された追加質問(#3)に返信することはできませんでした。応答しました。彼は頭に応答を釘付けにしている。はい、追加のコードは「良い習慣」とみなされますが、GCは過去10年間で最適化されており、こうしたコードを用意する必要はありませんでした。 +1からCCG。 – RLH

    関連する問題