Che cosa significa il contesto media di uscita per un WaitHandle.WaitOne significa?

StackOverflow https://stackoverflow.com/questions/7824497

  •  27-10-2019
  •  | 
  •  

Domanda

Sto cercando di utilizzare un mutex per l'accesso protezione da alcuni componenti hardware da più thread, ma sono confuso su ciò che i mezzi di parametri exitContext / fa:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

La documentazione dicono:

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

... Ma cosa significa che in realtà significa e quali sono le conseguenze di impostazione a vero o falso? Ho impostato a true per ora e il codice sembra funzionare, ma io sono nervoso che non comprendere appieno ciò che sta a sotto il cofano!

È stato utile?

Soluzione

Si spiega anche più in basso nella pagina sotto Osservazioni che:

Note Uscita dal contesto

Il parametro exitContext non ha alcun effetto a meno che il metodo è WaitOne chiamato dall'interno di un contesto non predefinita gestita. Questo può accadere se il thread è all'interno di una chiamata a un'istanza di una classe derivata da ContextBoundObject. Anche se si sta eseguendo un metodo su un classe che non deriva da ContextBoundObject, come String, è può essere in un contesto non predefinita se un ContextBoundObject è sulla vostra impilare nel dominio applicazione corrente.

Quando il codice viene eseguito in un contesto non predefinita, specificando true per exitContext causa il filo per uscire predefinita gestiti contesto (che è, per la transizione al contesto di default) prima eseguire il metodo WaitOne. Il filo ritorna l'originale contesto non predefinita dopo la chiamata al completamento del metodo WaitOne.

Questo può essere utile quando la classe legato al contesto ha SynchronizationAttribute. In tal caso, tutte le chiamate ai membri della classe vengono sincronizzati automaticamente, e il dominio di sincronizzazione è l'intero corpo del codice per la classe. Se il codice nella chiamata pila di dell'utente chiama il metodo WaitOne e specifica vero per exitContext, il filo esce dal dominio di sincronizzazione, permettendo un filo che è bloccato su una chiamata a qualsiasi membro dell'oggetto di procedere. Quando il WaitOne metodo restituisce, il thread che ha effettuato la chiamata deve attendere per Immettere nuovamente il dominio di sincronizzazione.

Altri suggerimenti

La sezione di Osservazione della pagina MSDN legge come gobbledegook assoluta naturalmente. contesti di esecuzione sono un dettaglio di implementazione ben nascosto in .NET. Mi limiterò a dirvi quello che ho invertito ingegnerizzati senza essere in grado di inchiodare completamente verso il basso.

exitContext argomento è rilevante in servizi remoti solo scenari. Passando true , si consente la chiamata in corso per essere sospeso e un'altra chiamata per effettuare il marshalling dal client al server. Faresti modo per migliorare il throughput, selezionando vero solo quando si aspetta la chiamata WaitOne () per prendere un po '. Le implicazioni esatte di farlo non sono comunque ovvio per me, né documentati da nessuna parte che io conosca. Il WaitOne () sovraccarico (nessun timeout) passa sempre false , che mette un po 'di sforzo sulla mia spiegazione purtroppo.

Un side-storia dietro questo metodo è che è così poco conosciuta che Microsoft ha deciso di rompere la compatibilità a ritroso nel .NET 2. Hanno aggiunto il (int) sovraccarico WaitOne nel Service Pack 2. Che passa false per la exitContext argomento. Ciò ha causato un sacco di caos, i programmatori ha iniziato ad usarlo poi trovato il loro programma a fallire quando viene eseguito su una versione pre-SP2 di .NET. Ouch.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top