318 votes

Comment puis-je obtenir mon programme C# pour dormir pendant 50 ms?

Comment puis-je obtenir mon programme C# pour dormir, pour 50 millisecondes?

Cela peut sembler une question facile, mais je vais avoir un temporaire cerveau échec moment!

392voto

Isak Savo Points 15357
System.Threading.Thread.Sleep(50);

N'oubliez pas, cependant, que le faire dans le main thread GUI va bloquer votre interface de mise à jour (il va se sentir "lente")

Il suffit de supprimer l' ; pour le faire fonctionner pour VB.net ainsi.

162voto

Thetam Points 4098

Fondamentalement, il y a 3 choix pour l'attente, dans (presque) n'importe quel langage de programmation:

  1. Lâche attente
    • L'exécution de thread se bloque de temps donné (= ne consomme pas de puissance de traitement)
    • Aucun traitement n'est possible bloqués/thread en attente
    • Pas si précise
  2. Serré en attente (également appelé boucle serrée)
    • le processeur est TRÈS occupé pour l'ensemble de l'intervalle d'attente (en fait, il consomme habituellement de 100% d'une base de temps de traitement)
    • Certaines actions peuvent être effectuées en attendant
    • Très précis
  3. La combinaison des 2 précédents
    • Il combine généralement l'efficacité du traitement de 1. et précision + possibilité de faire quelque chose de 2.

pour 1. - Lâche attente en C#:

Thread.Sleep(numberOfMilliseconds);

Cependant, windows planificateur de threads causes acccuracy d' Sleep() à être autour de 15ms (sorte de Sommeil peut facilement attendre 20ms, même si elle est prévue attendre juste pour 1ms).

pour 2. Étanche à l'attente en C# est:

Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
    //some other processing to do possible
    if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
    {
        break;
    }
}

On peut aussi utiliser DateTime.Now ou d'autres moyens de mesure du temps, mais Stopwatch est beaucoup plus rapide (et ce serait vraiment devenir visible dans la boucle).

pour 3. - Combinaison:

Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
    //some other processing to do STILL POSSIBLE
    if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
    {
        break;
    }
    Thread.Sleep(1); //so processor can rest for a while
}

Ce code régulièrement des blocs de threads pour 1ms (ou un peu plus, selon les OS de la planification des threads), de sorte que le processeur n'est pas occupé que le temps de blocage de code et de ne pas consommer 100% de la puissance du processeur. D'autres traitements peuvent encore être effectuées entre le blocage (comme: mise à jour de l'INTERFACE utilisateur, de la gestion d'événements ou de faire de l'interaction/communication trucs).

55voto

Joel Coehoorn Points 190579

Vous ne pouvez pas spécifier une exacte du temps de sommeil dans Windows. Vous avez besoin d'un système d'exploitation temps réel. Le meilleur que vous pouvez faire est de spécifier un minimum de temps de sommeil. Puis c'est le programmateur de réveil de votre fils après que. Et de ne jamais les appeler .Sleep() sur le thread GUI.

49voto

Toni Petrina Points 4745

Puisque vous avez maintenant async/await fonctionnalité, la meilleure façon de dormir 50ms est par l'utilisation de la Tâche.Délai:

async void foo()
{
    // something
    await Task.Delay(50);
}

Ou si vous visez .NET 4 (avec Async CTP 3 pour VS2010 ou Microsoft.Bcl.Async), vous devez utiliser:

async void foo()
{
    // something
    await TaskEx.Delay(50);
}

De cette façon, vous n'aurez pas bloquer le thread d'INTERFACE utilisateur.

32voto

Alexander Prokofyev Points 14183

Utilisez ce code

using System.Threading;
// ...
Thread.Sleep(50);

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