2009-05-02 5 views
8
static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo"); 

static void Main() 
{ 
    // Wait a few seconds if contended, in case another instance 
    // of the program is still in the process of shutting down. 

    if (!mutex.WaitOne (TimeSpan.FromSeconds (3), false)) 
    { 
     Console.WriteLine ("Another instance of the app is running. Bye!"); 
     return; 
    } 

    try 
    { 
     Console.WriteLine ("Running. Press Enter to exit"); 
     Console.ReadLine(); 
    } 
    finally { mutex.ReleaseMutex(); } 
} 

http://www.albahari.com/nutshell/ch20.aspxMit WaitOne() -Methode

In diesem Code:

if(mutex.WaitOne(TimeSpan.Zero, true)) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
    mutex.ReleaseMutex(); 
} 
else 
{ 
    MessageBox.Show("only one instance at a time"); 
} 

http://sanity-free.org/143/csharp_dotnet_single_instance_application.html

Es gibt keine Umkehrung des if/Bool.

Wenn waitone() wahr ist, bedeutet das, dass bereits eine Instanz läuft? Wenn true zurückgegeben wird, wird der aktuelle Thread blockiert, was bedeuten würde, dass zwei Prozesse, die dieselbe App aufrufen, beide anhalten werden?

Mein Verständnis ist, wie folgt:

// Don't block the thread while executing code. 
//Let the code finish and then signal for another process to enter 

Was die Implikation nicht ist! (zurück wahr) und umgekehrt. Oder mit anderen Worten, was passiert in beiden Richtungen?

Ich weiß warten, zum Beispiel, wartet auf alle Threads zu beenden. Jon Skeet hat auf seiner Seite ein gutes Beispiel dafür gezeigt, was mir im Gedächtnis geblieben ist (Anerkennung für seine Erklärungen). Offensichtlich wartet waitOne darauf, dass ein Thread beendet wird. Der Rückgabewert ist was mich verwirrt.

Antwort

15

Warten auf einen Mutex bedeutet warten, bis Sie es erwerben können.

WaitOne auf einem Mutex wird true zurückgeben, wenn der Mutex in der angegebenen Zeit erworben werden konnte. Wenn dies nicht möglich ist, gibt die Methode false zurück. Wenn der Mutex erworben wurde, liegt es in Ihrer Verantwortung, den Mutex freizugeben, wenn Sie damit fertig sind.

Wenn Sie einen benannten Mutex erwerben können, besitzt niemand ihn im Moment.

Also, um zu wiederholen. Wenn Sie den Mutex erwerben können, gibt die Methode true zurück und Sie sind die erste/einzige Instanz Ihrer Anwendung in Bezug auf Ihre Frage.

Wenn Sie den Mutex nicht erfassen können, gibt die Methode false zurück und es gibt eine andere Anwendungsinstanz, die gerade den Mutex unter diesem Namen besitzt.

1

in der MSDN die Beschreibung des mutex.WaitOne() ist folgendes:

Blockiert den aktuellen Thread, bis der aktuelle Waithandle ein Signal empfängt.

Und der Rückgabewert: true, wenn die aktuelle Instanz ein Signal

So erhält, bis die Anwendung einmal gestartet wird, wird es kein Signal von der mute.WaitOne() -Methode erhalten. Der Thread ist blockiert, wie es in der Beschreibung heißt.

So beantworten Sie die Frage:

Was die Implikation nicht ist! (zurück wahr) und umgekehrt.

Wenn Sie die mutex.WaitOne() -Methode negieren, dann werden Sie dies überprüfen: Wenn NICHT WaitOne(), es bedeutet, dass Sie prüfen, ob die WaitOne mit wahr nicht reagiert.

Ich hoffe, das ist jetzt klarer.