66 votes

Comparer l'utilisation de Thread.Sleep et de Timer pour une exécution différée

J'ai une méthode dont l'exécution doit être retardée pendant une durée déterminée.

Dois-je utiliser

Thread thread = new Thread(() => {
    Thread.Sleep(millisecond);
    action();
});
thread.IsBackground = true;
thread.Start();

Ou

Timer timer = new Timer(o => action(), null, millisecond, -1);

J'avais lu quelques articles sur l'utilisation Thread.Sleep est une mauvaise conception. Mais je ne comprends pas vraiment pourquoi.

Mais pour utiliser Timer, Timer a la méthode dispose. Comme l'exécution est retardée, je ne sais pas comment disposer du Timer. Avez-vous des suggestions ?

Ou si vous avez des codes alternatifs pour l'exécution retardée sont également appréciés.

2voto

Comme le dit la réponse ci-dessus, la création d'un nouveau fil de discussion est gourmande en ressources. Devrais-je utiliser ThreadPool à la place ?

ThreadPool.QueueUserWorkItem(o => {
    Thread.Sleep(millisecond);
    action();
});

1voto

Matt Points 2094

@miniscalope Non, n'utilisez pas ThreadPool.RegisterWaitForSingleObject au lieu de timer, System.Threading.Timer mettra en file d'attente un callback qui sera exécuté sur un thread du pool de threads lorsque le temps se sera écoulé et ne nécessitera pas de handle d'attente, wait for single object immobilisera un thread du pool de threads en attendant que l'événement soit signalé ou que le timeout expire avant que le thread n'appelle le callback.

0 votes

Avez-vous de la documentation à ce sujet ? Êtes-vous essentiellement en train de dire ThreadPool.RegisterWaitForSingleObject fonctionne comme Thread.Sleep en déclarant : "L'attente d'un objet unique immobilisera un thread du pool de threads en attendant que l'événement soit signalé ou que le délai d'attente expire avant que le thread n'appelle la fonction de rappel". ?

0 votes

Il n'utilise pas Thread.Sleep... après avoir creusé à travers la source, il implique qu'il appelle la méthode native RegisterWaitForSingleObject (je dis implique parce que la méthode qu'il appelle est extern mais décorée comme un appel interne au runtime...) Si cette supposition est correcte, vous pouvez supposer (à partir de la méthode docs ) qu'il utilisera un thread d'attente du pool de threads natif pour attendre que l'objet soit signalé, puis exécutera le callback sur un thread de travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X