CPU amical boucle infinie

Écrire une boucle infinie est simple:

while(true){
    //add whatever break condition here
}

Mais ce sera poubelle la performance du CPU. Ce thread d'exécution prendra autant que possible de la CPU de puissance.

Quel est le meilleur moyen pour diminuer l'impact sur le CPU?
L'ajout de certains Thread.Sleep(n) devrait faire l'affaire, mais la définition d'une haute valeur de délai d'expiration pour Sleep() méthode peut indiquer une application qui ne répond pas au système d'exploitation.

Disons que j'ai besoin pour effectuer une tâche chaque minute ou deux dans une application console.
J'ai besoin de garder Main() cours d'exécution dans une "boucle infinie", tandis qu'un timer déclenche l'événement qui va faire le travail. Je tiens à garder Main() avec l'impact le plus faible sur le CPU.

Quelles sont les méthodes que vous proposez. Sleep() peut être ok, mais comme je l'ai déjà mentionné, cela pourrait indiquer un insensible fil pour le système d'exploitation.

PLUS TARD EDIT:

Je veux expliquer mieux ce que je suis à la recherche d':

  1. - Je besoin d'une application console pas de service Windows. Console les applications peuvent simuler les services Windows sur Windows Mobile 6.x systèmes avec le Compact Framework.

  2. J'ai besoin d'un moyen de garder l'application en vie aussi longtemps que l'appareil Windows Mobile est en cours d'exécution.

  3. Nous savons tous que l'application de console s'exécute tant que ses statique de la fonction main() s'exécute, j'ai donc besoin d'un moyen de prévenir la fonction main() de sortie.

  4. Dans des situations particulières (comme: mise à jour de l'application), j'ai besoin de demander l'application d'arrêter, j'ai donc besoin de boucle à l'infini et de test pour certains sortie de la condition. Par exemple, c'est pourquoi Console.ReadLine() n'est d'aucune utilité pour moi. Il n'y a pas de sortie contrôle de condition.

  5. Concernant ce qui précède, je veux encore la fonction main() en tant que ressource conviviale que possible. Laissez asside l'empreinte de la fonction qui vérifie la condition de sortie.

  • Thread.Sleep(0) est probablement une bonne chose
  • Est-ce une application winforms?
  • Pourquoi n'avez-vous pas un Timer?
  • Sleep(0) abandonne le reste de l'actuelle tranche de temps, mais elle ne conduit pas à 100% d'utilisation CPU. De sorte qu'il ne fonctionne pas ici.
  • Pouvez-vous élaborer sur le "peut indiquer une application qui ne répond pas au système d'exploitation" problème? Êtes-vous sûr que c'est un problème dans une application console?
  • Aussi l'OS ne se soucie pas de répondre threads. Il se soucie de répondre fils qui possèdent une fenêtre. Et cela ne semble pas être le cas ici.
  • Sleep(0) résultats dans "ce % n'est pas utilisé ailleurs" qui est parfois assez cool - en particulier lors de la prise d'une application qui utilise des 'ressources' de faire son travail (par exemple, le projet SETI@Home ou quelque chose serait un cas d'utilisation).
  • Pour SETI et autres applications similaires, je serais tout simplement de réduire la priorité de mon processus/thread afin de ne pas obtenir de temps CPU quand quelqu'un d'autre en a besoin.
  • Quelle est votre Principale méthode de besoin dans cette "boucle infinie"? Peut-être principale peut le coup d'envoi de la minuterie, puis appeler la Console.ReadLine().

InformationsquelleAutor Adi | 2011-09-13