Le problème avec l'appel Thread.Sleep
sont expliquées tout à fait brièvement ici:
Thread.Sleep
a son utilisation: simulation des opérations de longue durée alors que les tests de débogage sur un thread MTA. Dans .NET il n'y a aucune autre raison de l'utiliser.
Thread.Sleep(n)
moyen de bloquer le thread en cours pour au moins le nombre
de timeslices (ou thread quantums) qui peuvent se produire au sein d' n
millisecondes.
La longueur d'un timeslice est différent sur différentes versions/types de
Windows et les différents processeurs et varie généralement de 15 à 30
millisecondes. Cela signifie que le fil est presque garanti à bloc pour
plus de n
millisecondes. La probabilité que votre thread
re-réveiller exactement après l' n
millisecondes est à peu près aussi impossible que
impossible, peut être. Donc, Thread.Sleep
est inutile pour le chronométrage.
Les Threads sont une ressource limitée, ils prennent environ 200 000 cycles
pour créer et environ 100 000 cycles pour les détruire. Par défaut, ils
réserve de 1 méga-octet de mémoire virtuelle pour sa pile et l'utilisation de 2 000 à 8 000
cycles pour chaque changement de contexte. Ce qui rend l'un thread en attente d'un
énorme de déchets.
La solution préférée: WaitHandles
Les plus-erreur à l'aide de Thread.Sleep
avec un temps de construire (démo et de répondre, blog de nice-entrée)
EDIT:
Je voudrais améliorer ma réponse:
Nous avons 2 différents cas d'utilisation: 1) Nous sommes en attente parce que nous savons un
spécifique de temps, alors que nous devrions continuer (utiliser Thread.Sleep
, System.Threading.Timer
ou similaires)
2) Nous sommes en attente en raison des changements de condition de quelques temps ...
mot-clé(s) est/sont un certain temps! si l'état-vérifier dans notre code de domaine, nous
devrait utiliser WaitHandles - sinon le composant externe doit
fournir une certaine forme de crochets ... si ce n'est pas sa conception, c'est mal! Mon
réponse couvre principalement les cas d'utilisation de 2