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!
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!
Fondamentalement, il y a 3 choix pour l'attente, dans (presque) n'importe quel langage de programmation:
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).
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.
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.
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.