2011-08-18 17 views
10

Sto lavorando su 2 Servizi Windows che hanno un database comune che voglio bloccare (cross-process) con un sistema Mutex.Devo smaltire un Mutex?

Ora mi chiedo se è giusto da chiamare solo WaitOne() e ReleaseMutex() in un blocco try-finally o devo anche disporre il Mutex (ad esempio in un blocco using). Se è così suppongo che dovrei sempre prendere lo AbandonedMutexException sul metodo WaitOne() o sbaglio qui?

+0

È necessario l'AbandonedMutexException per dirti che il servizio che possiede il mutex è terminato in modo imprevisto. In tal caso, * deve * smettere di usare dbase e attendere che l'altro servizio si avvii di nuovo.Usare un terzo processo per agire come arbitro sarebbe saggio. –

risposta

12

Un mutex è un oggetto kernel di Windows (qui avvolta in un oggetto .NET).

In quanto tale, è una risorsa non gestita che deve essere smaltita.

Più precisamente, l'oggetto .NET contiene un HANDLE per il mutex, che deve essere rilasciato/smaltito in qualche modo.

Non mi fido di quello code sample in the Mutex class docs in cui l'oggetto mutex non è disposto. Sebbene Henzi abbia un buon punto nel commento: l'oggetto Mutex è statico e verrà eliminato dal finalizzatore o distrutto dal kernel di Windows al termine dell'esecuzione del processo.

Inoltre, notare che Close() dispone anche l'oggetto.

Ovviamente, non c'è niente di sbagliato nel mantenere un oggetto Mutex esistente nella tua app anche se non lo usi. Sono risorse leggere.

+0

Non è rimasto alcun esempio di codice, è necessario collegarlo: http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

terminato. La prossima volta, sentiti libero di modificare la mia risposta ;-) –

+0

Ma dal momento che sto creando servizi Windows, penso che non dovrei preoccuparmi dello smaltimento durante il "runtime" dei miei servizi (che è sempre). La creazione di una nuova istanza di Mutex con lo stesso nome ogni volta avvolgerebbe la stessa istanza non gestita correttamente? O creerà continuamente nuove risorse non gestite? Potrei chiudere il mutex quando uno dei miei servizi viene fermato per pulirlo davvero? – Koen

2

È necessario disporre delle risorse utilizzate dal waitewle.

Dalla documentazione:

Rilascia tutte le risorse utilizzate dall'istanza corrente della classe WaitHandle . (Ereditato da WaitHandle.)

Il waitelpe utilizza risorse non gestite che devono essere smaltite al termine dell'utilizzo.

MSDN Documentation Mutex

6

In base a this un nome Mutex viene automaticamente distrutto quando termina l'ultimo processo che contiene un HANDLE di quel Mutex.

in termini non gestiti MSDN dice

utilizzare la funzione CloseHandle per chiudere l'handle. Il sistema chiude automaticamente l'handle quando il processo termina. L'oggetto mutex viene distrutto quando l'ultima maniglia è stata chiusa.

In .NET è necessario chiamare .Close() sul Mutex - questo rilascia l'HANDLE ... dal momento che ogni processo ottiene il proprio HANDLE quando si accede anche lo stesso nome Mutex questo è prassi consolidata ... non chiamare Close() vinto' t lasciare problemi behing una volta che il processo non è più (finalizzatori e tutti) ...