Minuteurs du serveur sont une créature différente des fils dormants.
D'une part, en fonction de la priorité de votre thread et de ce qui est en cours d'exécution, votre thread endormi peut ou non être réveillé et programmé pour s'exécuter à l'intervalle que vous demandez. Si l'intervalle est suffisamment long, et que la précision de la programmation n'a pas vraiment d'importance, Thread.Sleep()
est un choix raisonnable.
Les minuteurs, en revanche, peuvent déclencher leurs événements sur n'importe quel thread, ce qui permet de meilleures capacités de planification. Le coût de l'utilisation des minuteries, cependant, est un peu plus de complexité dans votre code - et le fait que vous ne pouvez pas être en mesure de contrôler quel thread exécute la logique sur laquelle l'événement de minuterie se déclenche. Extrait de la documentation :
Le Timer basé sur le serveur est conçu pour l'utilisation de threads de travail dans un environnement multithread. Le serveur peuvent se déplacer entre les threads pour gérer l'événement Elapsed soulevé, ce qui permet une plus grande précision que que les chronomètres Windows pour ce qui est de lever l'événement à temps.
Une autre considération est que les minuteurs invoquent leur délégué Elapsed sur un thread ThreadPool. En fonction de la durée et/ou de la complexité de votre logique, vous pouvez ne pas vouloir l'exécuter sur le pool de threads - vous pouvez vouloir un thread dédié. Un autre facteur avec les minuteries, est que si le traitement prend suffisamment de temps, l'événement de minuterie peut être soulevé à nouveau (simultanément) sur un autre thread - ce qui peut être un problème si le code exécuté n'est pas prévu ou structuré pour la concurrence.
Ne confondez pas Minuteurs du serveur avec " Minuteurs Windows ". Ce dernier terme fait généralement référence aux messages WM_TIMER qui peuvent être envoyés à une fenêtre, permettant ainsi à une application de planifier et de répondre à un traitement minuté sur son thread principal sans dormir. Toutefois, Windows Timers peut également faire référence aux messages suivants API Win pour le timing de bas niveau (ce qui n'est pas la même chose que WM_TIMER).