Quelle est la différence entre Thread.Sleep (timeout) et ManualResetEvent.Wait (timeout)?
Deux Fils.Sommeil(délai d'attente) et resetEvent.D'attente(timeout) cause interrompre l'exécution d'au moins timeout
millisecondes, donc, il y a une différence entre eux? Je sais que ce Thread.Sommeil provoque le fil d'abandonner le reste de sa tranche de temps, ce qui peut entraîner un sommeil qui dure beaucoup plus longtemps que demandé. Le d'Attente(timeout) la méthode de l'ManualResetEvent objet ont le même problème?
Modifier: je suis conscient qu'un ManualResetEvent du point principal est d'être signalé à partir d'un autre thread - maintenant, je me préoccupe seulement le cas d'un événement d'Attente méthode avec un délai spécifié, et pas les autres appelants paramètre de l'événement. Je veux savoir si c'est plus fiable pour éveiller sur le temps que de Fil.Sommeil
source d'informationauteur Erik Forbes
Vous devez vous connecter pour publier un commentaire.
Thread.Sleep(timeout)
provoque une inconditionnelle d'attente avant l'exécution de la reprise.resetEvent.WaitOne(timeout)
provoque le fil d'attendre jusqu'à ce que soit (1) l'événement est déclenché, ou (2) le délai est atteint.Le point de l'utilisation des événements est de les déclencher à partir d'un autre thread, vous pouvez contrôler directement lorsque le thread se réveille. Si vous n'en avez pas besoin, vous ne devriez pas utiliser des objets événement.
EDIT: Calendrier-sages, ils sont à la fois tout aussi fiable. Cependant, votre commentaire à propos de "l'éveil à l'heure" m'inquiète. Pourquoi avez-vous besoin de votre code pour se réveiller à temps?
Sleep
etWaitOne
ne sont pas vraiment conçus avec précision à l'esprit.Seulement si
timeout
est inférieur à 50 ms ou alors, et vous avez besoin de la fiabilitévous devriez regarder dans les autres méthodes de synchronisation. Cet article ressemble à une assez bonne vue d'ensemble.La principale différence entre
Thread.Le sommeil
etManualResetEvent.WaitOne
est que vous pouvez le signal à un thread en attente sur un ManualResetEvent à l'aide de la Ensemble méthode, provoquant le fil à réveiller plus tôt que le délai d'attente.Si vous n'avez pas de signal alors je m'attends à se comporter d'une manière très semblable.
.NET Reflector je peux voir que la méthode
ManualResetEvent.WaitOne
éventuellement les résultats dans un appel à une méthode extern avec la signature suivante:Alors que
Thread.Sleep
appelle cette méthode extern:Malheureusement je n'ai pas le code source de ces méthodes, donc je ne peux que deviner. J'imagine que dans les deux appels dans le fil d'obtention prévue pendant qu'il est en attente pour le temps d'expirer, aucune n'étant plus précis que les autres.
Pour les retards et periodics j'ai trouvé Moniteur.Attendre un bon choix..
Cela donne un excellent résultat....~1 ms gigue ou mieux selon le domaine d'application spécifiques.
Comme vous le savez peut-être déjà Thread.Sommeil(X) n'est pas fiable et ne peut pas être annulé....- Je l'éviter comme la peste.
Le Sleep() la fonction n'a pas fonctionné de cette façon pendant une longue période. Sa précision est déterminée par le multimédia délai, quelque chose que vous pouvez changer par P/Invoquant timeBeginPeriod(). Malheureusement, sur ma machine, j'ai obtenu une sorte de programme qui définit cette période à un ordre de la milliseconde, faisant dort exacte à une milliseconde. Voici un code pour essayer pour vous-même:
Sortie sur ma machine:
Sommeil: 999, Attendez: 1003
avec une variabilité de l'ordre de 5 millisecondes.
Le Sommeil continue pour l'heure spécifiée. L'événement, vous pouvez attendre la fin plus tôt si l'événement est signalé. C'est le but des événements: pour permettre à un thread pour dire à l'autre de se réveiller.
Dans un thread vous dirais:
Dans un autre, vous dirais:
Sans l'appel à
Set
dans l'autre thread, le premier thread qui permettrait de dormir pendant 10 secondes.Comme d'autres l'ont mentionné, la différence est WaitOne pourrait revenir avant que le temps de sommeil si signalé. Le sommeil est garanti à attendre que le temps de sommeil.
Fil.Dormir dans un réflecteur appels:
ManualResetEvent.Attendre dans le réflecteur appels:
Ne sais pas si il y a une différence entre les deux, mais je vais voir si je peux trouver quelque chose.