Pourquoi l'utilisation du Système.Le filetage.Fil de discussion.Sleep() est une mauvaise pratique?
Je suis en train d'écrire une application fonctionnant avec une grosse et moche 3ème partie du système via une API complexe.
Parfois, certaines erreurs se produisent dans le système, mais si nous attendons pour mon programme pour faire face à cette erreur, il peut être trop tard.
J'utilise un thread séparé pour vérifier l'état du système comme suit:
while (true)
{
ask_state();
check_state();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}
Il n'importe pas vraiment si je vérifier l'état du système une fois en 100 ms ou une fois par minute.
Mais j'ai entendu dire que l'utilisation de Threads.Sleep() est une mauvaise pratique. Pourquoi? Et que puis-je faire dans cette situation?
Si vous voulez vérifier quelque chose régulièrement, pourquoi ne pas utiliser une minuterie?
La principale question est " est la minuterie mieux ou pas? et pourquoi Thread.Sleep() est mauvais?'
Parce que vous gardez un fil vivant inutiles. La question de savoir si cela est vraiment important est bien sûr en fonction de votre contexte. Si vous disposez d'une simple application, puis à l'aide d'un minuteur périodique ou un thread dédié ne serait probablement pas générer des différences de rendement depuis la minuterie sera tout simplement la force d'un thread du pool de threads pour rester en vie.
En général (et en particulier avec une très grande application multi-thread), il y a plus de descriptif des solutions de rechange. par exemple, une minuterie.
"J'ai entendu dire que l'utilisation de Threads.Sleep() est une mauvaise pratique " - presque tout peut être utilisée à mauvais escient. Est-ce que votre code de travail ci-dessus? Si oui, il suffit de laisser.
La principale question est " est la minuterie mieux ou pas? et pourquoi Thread.Sleep() est mauvais?'
Parce que vous gardez un fil vivant inutiles. La question de savoir si cela est vraiment important est bien sûr en fonction de votre contexte. Si vous disposez d'une simple application, puis à l'aide d'un minuteur périodique ou un thread dédié ne serait probablement pas générer des différences de rendement depuis la minuterie sera tout simplement la force d'un thread du pool de threads pour rester en vie.
En général (et en particulier avec une très grande application multi-thread), il y a plus de descriptif des solutions de rechange. par exemple, une minuterie.
"J'ai entendu dire que l'utilisation de Threads.Sleep() est une mauvaise pratique " - presque tout peut être utilisée à mauvais escient. Est-ce que votre code de travail ci-dessus? Si oui, il suffit de laisser.
OriginalL'auteur user2862319 | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Une des raisons est que
Thread.Sleep()
est le blocage de votre code à partir de rien faire d'autre. Les efforts récents est de faire de blocage que le moins possible. Par exemple, node.js est un non-blocage de la langue.Mise à jour: je ne sais pas à propos de l'infrastructure de
Timer
classe en C#. C'est peut-être aussi le blocage.Vous pouvez planifier une tâche de vérifier que le tiers de l'API toutes les 100 ms. De cette façon, pendant 100 ms, votre programme peut effectuer d'autres tâches.
Mise à jour: Cette analogie peut aider. Si l'on compare le système d'exploitation à l'hôpital, et de comparer les threads pour les infirmières de l'hôpital, le superviseur (le programmeur) peut choisir une stratégie:
Sleep()
méthode)Le premier modèle est le blocage. Ce n'est pas évolutive. Mais dans le second modèle, même avec quelques infirmières, vous pourriez être en mesure de servir un grand nombre de patients.
Thread séparé ne veut pas dire qu'il est non-bloquant. Pendant ce temps, l'autre thread serait mis en attente et ne sera pas revenir à fil-piscine afin de faire le travail.
Oui, c'est dans un thread séparé
Pas de @user2862319, je ne suis pas en train de dire que :D. je veux juste dire qu'une raison pour laquelle ils découragent à l'aide de
Sleep
est que cela bloque. Je ne sais pas à propos de l'infrastructure deTimer
. Peut-être, qui utilise égalementSleep
sous le capot.Otoh, que, à l'aide d'horaire moyen de l'écriture de code comme un très-peut-être-salissante asynchrone de l'état de la machine au lieu de en ligne, comme avec des threads séparés, où Dormir() peut être appelée n'importe où et à n'importe quelle fonction de la profondeur. Le tir d'une horloge, une minuterie de gestion de thread nécessite au moins autant au contexte des changements comme un Sleep() de l'appel, et peut-être le double si la minuterie de rappel des signaux d'un autre thread qui est en attente sur les messages d'entrée.
OriginalL'auteur Saeed Neamati
Parce que la seule façon de fermer ce thread si elle est en attente à l'intérieur de la
Sommeil
est soit a) d'attendre leSleep
à la fin, ou b) utiliser l'un desThread.Annuler
ouThread.Interrompre
.1Si c'est un long sommeil, alors (un) n'est pas vraiment adapté si vous essayez d'être réactif. Et (b) sont assez désagréable si le code arrive à pas être réellement à l'intérieur de la
Sleep
à l'époque.C'est beaucoup mieux, si vous voulez être en mesure d'interrompre le sommeil de comportement de façon appropriée, utiliser un waitable objet (comme par exemple, un
ManualResetEvent
) - vous pouvez même être en mesure de placer l'attendre sur le waitable objet dans lewhile
conditionnelle, de le rendre clair ce qui va provoquer le fil à la sortie.1 j'ai utiliser de l'arrêt dans cet exemple parce que c'est un scénario très commun, où la croix-thread de communication est nécessaire. Mais pour tous les autres cross-thread de signalisation ou de communication, le même raisonnement peut également s'appliquer, et si c'est pas arrêt puis
Thread.Abort
ouThread.Interrupt
sont encore moins.OriginalL'auteur Damien_The_Unbeliever
je voudrais mettre une minuterie pour quelle que soit la mme que vous voulez et attendre mon chèque méthodes afin d'effectuer, par la façon dont vous souhaitez utiliser une boucle sans fin ou il n'est pas un code complet qui vous est arrivé ?
ok c'est un exemple de ce dont je parle:
bonne chance
ok, donc il suffit d'utiliser un timer au lieu de dormir(), voici un échantillon de ce que je vous parle :
OriginalL'auteur chouaib