2011-10-19 11 views
12

che sto cercando di utilizzare un mutex per proteggere l'accesso a alcuni componenti hardware da più thread, ma sono confuso su ciò che il parametro exitContext significa/fa:Che cosa significa il contesto di uscita per WaitHandle.WaitOne?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs dicono:

exitContext - true per uscire dal dominio di sincronizzazione per il contesto prima dell'attesa (se in un contesto sincronizzato) e riacquistarlo successivamente; altrimenti, false.

... ma che cosa significa in realtà e quali sono le conseguenze di impostarlo su true o false? Ho impostato su true per ora e il codice sembra funzionare, ma sono nervoso che non capisco appieno cosa sta succedendo sotto il cofano!

risposta

5

Spiega anche che further down the page under Remarks:

Note Uscita dal contesto

Il parametro exitContext ha effetto solo se il metodo è WaitOne chiamato dall'interno di un contesto non predefinita gestita. Ciò può accadere se il thread si trova all'interno di una chiamata a un'istanza di una classe derivata da ContextBoundObject. Anche se si sta eseguendo un metodo su una classe che non deriva da ContextBoundObject, ad esempio String, è possibile impostare in un contesto non predefinito se un oggetto ContextBoundObject è nello stack nel dominio dell'applicazione corrente.

Quando il codice viene eseguito in un contesto non predefinita, specificando vero per exitContext fa sì che il filo per uscire dal non predefinita gestita contesto (vale a dire, di transizione verso il contesto predefinito) prima di eseguire il metodo WaitOne. Il thread ritorna al contesto non predefinito originale dopo il completamento della chiamata al metodo WaitOne.

Questo può essere utile quando la classe legata al contesto ha SynchronizationAttribute. In tal caso, tutte le chiamate ai membri della classe vengono automaticamente sincronizzate e il dominio di sincronizzazione è l'intero corpo del codice per la classe. Se il codice nello stack di chiamate di un membro chiama il metodo WaitOne e specifica true per exitContext, , il thread esce dal dominio di sincronizzazione, consentendo a un thread che è bloccato su una chiamata a qualsiasi membro dell'oggetto di procedere. Quando viene restituito il metodo WaitOne , il thread che ha effettuato la chiamata deve attendere immettere nuovamente il dominio di sincronizzazione.

14

La sezione Note della pagina MSDN si legge come un vero e proprio gobbledegook. I contesti di esecuzione sono dettagli di implementazione ben nascosti in .NET. Ti dirò semplicemente che cosa ho invertito progettato senza riuscire a inchiodarlo completamente.

L'argomento exitContext è rilevante solo per gli scenari remoti.Passando allo true, si consente di sospendere la chiamata corrente e di effettuare il marshalling di un'altra chiamata dal client al server. Lo faresti per migliorare il throughput, selezionando true solo quando ti aspetti che la chiamata a WaitOne() richieda un po 'di tempo. Le implicazioni esatte di farlo non sono tuttavia ovvie per me, né documentate da nessuna parte che io conosca. L'overload di WaitOne() (nessun timeout) passa sempre false, che purtroppo mette a dura prova la mia spiegazione.

Un side-story dietro questo metodo è che è così poco compreso che Microsoft ha deciso di interrompere la retrocompatibilità in .NET 2. Hanno aggiunto l'overload WaitOne (int) nel service pack 2. Che passa false per exitContext Argomento. Ciò ha causato un sacco di caos, i programmatori hanno iniziato a usarlo e poi hanno trovato il loro programma fallire quando eseguito su una versione precedente a SP2 di .NET. Ahia.