Qu'est-ce que la moyenne de contexte de sortie pour un WaitHandle.WaitOne signifie?

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

  •  27-10-2019
  •  | 
  •  

Question

Je suis en train d'utiliser un mutex pour protéger l'accès à certains matériels de plusieurs threads, mais je suis confus quant à ce que les moyens de paramètres exitContext / t:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

Les docs disent:

exitContext - true pour quitter le domaine de synchronisation du contexte avant le temps d'attente (si dans un contexte synchronisé), et il réacquérir après; sinon, false .

... mais qu'est-ce que signifie réellement et quelles sont les conséquences de la mise à vrai ou faux? Je l'ai mis à vrai pour l'instant et le code semble fonctionner, mais je suis nerveux que je ne comprends pas bien ce que c'est sous le capot!

Était-ce utile?

La solution

Il explique aussi plus bas sur la page sous Remarques que:

Notes sur le contexte Quitter

Le paramètre exitContext n'a pas d'effet à moins que le procédé de WaitOne est appelé à l'intérieur d'un contexte géré nondefault. Cela peut se produire si votre fil est à l'intérieur d'un appel à une instance d'une classe dérivée de ContextBoundObject. Même si vous êtes en train d'exécuter une méthode sur un classe qui ne dérive pas de ContextBoundObject, comme String, vous peut être dans un contexte nondefault si un ContextBoundObject est sur votre empiler dans le domaine d'application de courant.

Lorsque votre code est exécuté dans un contexte non défini par défaut, en spécifiant vrai pour exitContext provoque le fil pour quitter le nondefault géré contexte (qui est, à la transition vers le contexte par défaut) avant exécution du procédé de WaitOne. Les retours de fil à l'original contexte nondefault après l'appel à la méthode WaitOne finalise.

Cela peut être utile lorsque la classe de contexte lié a SynchronizationAttribute. Dans ce cas, tous les appels aux membres du classe sont automatiquement synchronisés, et le domaine de synchronisation est le corps du code de la classe. Si le code dans la pile d'appel un membre appelle la méthode WaitOne et précise vrai pour exitContext, le fil sort du domaine de synchronisation, permettant à un fil qui est bloqué par un appel à un membre de l'objet à poursuivre. Quand le WaitOne Les retours de méthode, le fil qui a fait l'appel doit attendre pour reenter le domaine de synchronisation.

Autres conseils

La section Remarque de la page MSDN se lit comme charabia total bien sûr. Les contextes d'exécution sont un détail de mise en œuvre bien caché dans .NET. Je vais vous dire ce que je décompilé sans pouvoir clouer complètement vers le bas.

exitContext argument est pertinent dans les scénarios d'accès distant uniquement. En passant true , vous permettent l'appel en cours à suspendre et un autre appel à marshalés du client vers le serveur. Vous feriez donc d'améliorer le débit, le choix vrai que lorsque vous attendez l'appel WaitOne () pour prendre un certain temps. Les implications exactes de le faire sont cependant pas évident pour moi, ni documenté nulle part que je connaisse. La surcharge WaitOne () (pas de délai d'attente) passe toujours false , qui met une contrainte sur mon explication malheureusement.

A côté histoire derrière cette méthode est qu'il est si mal compris que Microsoft a décidé de rompre la compatibilité descendante dans .NET 2. Ils ont ajouté la surcharge WaitOne (int) dans Service Pack 2. Ce qui passe false pour le exitContext argument. Cela a causé beaucoup de grabuge, les programmeurs commencé à l'utiliser alors trouvé leur programme à l'échec lorsqu'il est exécuté sur une version pré-SP2 de .NET. Aïe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top