Question

Dans C#, quand on doit utiliser WaitHandle au lieu de lock?

Était-ce utile?

La solution

Un verrou est fondamentalement différent d'un WaitHandle. Avec un verrou que vous écrivez, par exemple:

lock (SomeResource)
{
    // do stuff here
}

La première ligne dit: « Je veux un accès exclusif à cette ressource » et attendra que cette ressource est disponible (à savoir personne d'autre n'a un verrou sur elle). Ensuite, les pistes de code et à la fin le verrou est libéré de sorte que d'autres puissent l'utiliser.

WaitHandle sert à attendre un événement doit avoir lieu. Lorsque vous écrivez:

MyWaitHandle.WaitOne();

Votre code est en attente d'un autre fil (éventuellement dans un processus différent) pour signaler que WaitHandle. Ce que cela signaux pourraient être quelque chose. Peut-être que vous êtes en attente d'un autre thread pour terminer son travail et dire: « Je suis fait maintenant, » avant votre code peut continuer.

Alors, pour répondre à votre question, vous devez utiliser un verrou quand vous voulez avoir un accès exclusif à une ressource. Vous devez utiliser WaitHandle lorsque vous souhaitez être averti d'un événement.

Autres conseils

Un WaitHandle peut attendre plusieurs poignées, une serrure peut attendre une seule.

Lorsque vous en avez besoin. Sérieusement, serrure est le sucre syntaxique avec Monitor, qui utilise probablement WaitHandles interne.

Utilisez uniquement si vous avez besoin de plus de flexibilité (comme par exemple la tenue à un verrouillage plus longue que la portée actuelle ...) ou de gérer plusieurs verrous dans le bon ordre, etc.

Ils accomplissent des choses complètement différentes. Un lock est utilisé pour limiter l'accès à un bloc de code spécifique à une à thread à la fois. Un WaitHandle est la classe de base pour plusieurs classes liées, tels accès concurrentiel comme Semaphore, Mutex, AutoResetEvent et ManualResetEvent, qui vous permettent de contrôler la concurrence de façon légèrement différente. Par exemple, un Semaphore vous permet de limiter à concurrence pas plus de N fils de discussion, au lieu d'un seul fil.

WaitHandle est souvent utilisé lorsque vous avez plusieurs threads en cours d'exécution et que vous voulez attendre un ou tous à remplir avant de continuer à faire une autre action. lock serait utilisé si vous voulez éviter plusieurs threads d'accéder à une ressource partagée en même temps.

Les meilleurs mensonges d'explication dans ces deux liens. Malheureusement, vous allez devoir faire un peu de lecture pour obtenir une réponse complète au type de question que vous avez demandé:

Il contient un exemple aussi bien: http://msdn.microsoft.com/en-us/library /system.threading.waithandle.aspx

http://msdn.microsoft.com/en-us/library/ kad9xah9.aspx

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