Je suis en train de mettre en place un thread très basique en C #: puis j'obtiens immédiatement 100% de la CPU. Je souhaite vérifier si les données de capteur sont lues à l'intérieur de la boucle (vraie). Pourquoi c'est comme ça? P> Merci d'avance. P> P>
5 Réponses :
Vous pouvez ajouter Aussi, on dirait que vous avez réellement besoin d'une minuterie. P>
Regardez l'une des classes de minuterie ici http: // msdn.microsoft.com/en-us/library/system.threading.Timer.aspx . P>
Utilisez la minuterie avec un intervalle de tirage élevé que vous pouvez vous permettre, 1 seconde, une demi-seconde. tandis que (vrai) code> est ce qui tue votre CPU. P>
thread.sleep (x) code> à vous pour donner au CPU du repos avant de vérifier à nouveau. P>
Vous devez échanger entre l'utilisation de la CPU et le délai maximum que vous pouvez vous permettre entre chèques. P>
Salut. Merci. Mais alors comment puis-je attendre que les données arrivent? Je voudrais vérifier continuellement les données à venir.
À quelle fréquence devez-vous vérifier de manière réaliste? Même le laisser dormir pendant 10 ms fera une énorme différence.
@Joesyxhn - D'où vient vos données?
Laissez votre boucle dormir em>. Ça cource et autour et se fatigue. À tout le moins, laissez-le prendre un pause em> éventuellement. P>
Devrais-je utiliser: Timer.Tick par 1 milliseconde au lieu d'utiliser le fil avec tout en boucle et dormir pendant 1 milliseconde?
Bahahahahahahahaha! 1 milliseconde! Essayez 100-500 millisecondes.
Vous pouvez utiliser la file d'attente de blocage. Prenez un élément de la file d'attente de blocage bloquera le fil jusqu'à ce qu'il y ait un élément mis dans la file d'attente. qui ne coûte pas de processeur. p>
avec .net4, vous pouvez utiliser BlockingCollection http://msdn.microsoft. com / fr-nous / bibliothèque / dd267312.aspx p>
Sous la version 4, il n'ya pas de bloquer la file d'attente INT .NET Framework. P>
Vous pouvez trouver de nombreux outils de bloquage de la file d'attente si vous le google. p>
Voici une implémentation p>
Comment Blocking Collection aidera-t-il que Joesyxhn a besoin de vérifier un fichier ou une API externe ou autre chose?
vous avez raison. S'il veut regarder un fichier ou que les données proviennent de l'API externe. La collecte de blocage est inutile.
Alors je lui ai demandé où vient les données.
Parce que votre fonction ne fait rien à l'intérieur du bloc tandis que celui-ci attrape la CPU et, à toutes fins pratiques, ne l'enlève jamais, d'autres threads peuvent faire leur travail
Si vous interrogez pour une condition, faites définitivement comme d'autres suggérées et mettez-les en sommeil. J'ajouterais également que si vous avez besoin de performances maximales, vous pouvez utiliser un astuce statistique pour éviter de dormir lorsque les données du capteur ont été lues. Lorsque vous détectez que les données du capteur sont inactifs, disons, 10 fois de suite, puis commencez à dormir sur chaque itération à nouveau. P>
Pouvons-nous supposer qu'il existe en réalité une implémentation dans la boucle
pendant code> et qu'elle a une certaine capacité à se terminer?
Obtenir 100% CPU est correct selon ce code. Y a-t-il un intervalle que vous souhaitez vérifier les données du capteur? Vous devrez probablement dormir le fil en conséquence.