Une différence est que System.Threading.Timer
envoie le callback sur un thread du pool de threads, plutôt que de créer un nouveau thread à chaque fois. Si vous avez besoin que cela se produise plus d'une fois au cours de la vie de votre application, cela vous évitera de créer et de détruire un grand nombre de threads (un processus très gourmand en ressources, comme le souligne l'article auquel vous faites référence), puisque vous réutiliserez simplement les threads du pool, et si vous avez plus d'un timer en cours en même temps, cela signifie que vous aurez moins de threads en cours d'exécution en même temps (ce qui économise également des ressources considérables).
En d'autres termes, Timer
va être beaucoup plus efficace. Elle peut aussi être plus précise, puisque Thread.Sleep
est garanti d'attendre au MOINS aussi longtemps que la durée que vous avez spécifiée (le système d'exploitation peut le mettre en veille pendant beaucoup plus longtemps). Accordé, Timer
ne sera toujours pas exactement exacte, mais l'intention est de déclencher le rappel aussi près que possible de l'heure spécifiée, alors que ce n'est PAS nécessairement l'intention de l'option Thread.Sleep
.
Quant à la destruction de la Timer
la fonction de rappel peut accepter un paramètre, de sorte que vous pouvez passer l'option Timer
en tant que paramètre et appeler Dispose dans le callback (bien que je n'aie pas essayé ceci -- je suppose qu'il est possible que le Timer soit verrouillé pendant le callback).
Edit : Non, je suppose que vous ne pouvez pas le faire, puisque vous devez spécifier le paramètre de rappel dans le champ Timer
constructeur lui-même.
Peut-être quelque chose comme ça ? (Encore une fois, je ne l'ai pas encore essayé)
class TimerState
{
public Timer Timer;
}
...et pour lancer le minuteur :
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
Le verrouillage doit empêcher la callback du timer d'essayer de libérer le timer avant que la fonction de verrouillage ne soit activée. Timer
le champ ayant été défini.
Addendum : Comme l'a souligné le commentateur, si action()
fait quelque chose avec l'interface utilisateur, alors l'utilisation d'un fichier System.Windows.Forms.Timer
est probablement une meilleure solution, puisqu'elle exécutera le rappel sur le fil d'exécution de l'interface utilisateur. Cependant, si ce n'est pas le cas, et qu'il s'agit de Thread.Sleep
vs. Threading.Timer
, Threading.Timer
est la voie à suivre.