2009-05-02 7 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.aspxUso WaitOne() metodo

In questo codice:

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

Non c'è inversione del if/bool.

Se waitone() è vero, vuol dire che un'istanza è già in esecuzione? Se viene restituito true, il thread corrente verrà bloccato, il che significherebbe che due processi che chiamano la stessa app si interromperanno entrambi?

La mia comprensione è la seguente:

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

Qual è l'implicazione di no! (restituendo true) e viceversa. O in altre parole, cosa succede in entrambi i modi?

So waitAll per esempio, aspetta che tutti i thread finiscano. Jon Skeet ha mostrato un buon esempio di questo sul suo sito, che è rimasto impressa nella mia mente (merito delle sue spiegazioni). Quindi ovviamente waitOne aspetta che un thread finisca. Il valore di ritorno è ciò che mi confonde.

risposta

15

Attendere un mutex significa attendere fino a quando non è possibile acquistarlo.

WaitOne su un Mutex restituirà true se il mutex potrebbe essere acquisito nel tempo stabilito. In caso contrario, il metodo restituirà false. Se il mutex è stato acquisito, è tua responsabilità rilasciare il mutex quando hai finito.

Se è possibile acquisire un mutex denominato, nessun altro lo possiede al momento.

Quindi, per ricapitolare. Se riesci ad acquisire il mutex, il metodo restituisce true e tu sei la prima/unica istanza della tua applicazione, in relazione alla tua domanda.

Se non è possibile acquisire il mutex, il metodo restituisce false e vi è un'altra istanza dell'applicazione che attualmente possiede il mutex con quel nome.

1

Nel MSDN descrizione di mutex.WaitOne() è presente:

Blocca il thread corrente fino a che la corrente WaitHandle riceve un segnale.

E il valore di ritorno è: true se l'istanza corrente riceve un segnale

Così fino a quando l'applicazione viene avviata una volta, non riceverà alcun segnale dal metodo mute.WaitOne(). Il thread è bloccato come si dice nella descrizione.

Quindi, per rispondergli domanda:

Qual è l'implicazione di no! (restituendo true) e viceversa.

Se si nega il metodo mutex.WaitOne(), allora si avrà controllare questo: se non WaitOne(), significa che si controlla se il WaitOne non risponde con vera.

Spero che ora sia più chiaro.