2010-11-18 96 views
3

J'ai récemment construit un service utilise un seul thread pour traiter les informations périodiquement. Le service a été créé à l'aide de Microsoft Visual Studio 2010 Express. J'ai remarqué que l'utilisation du processeur a décollé vers la Lune (utilisation du processeur à 100%). Plus tard, par curiosité, j'ai construit un très petit programme, dans lequel tout ce qu'il fait est de démarrer un petit thread, ou un minuteur, puis exécute une boucle incroyablement longue. J'ai également basculé de la construction d'une application console à une application Windows Form. J'ai été capable de réduire mes problèmes en changeant le type de programme à construire.L'utilisation du processeur devient très élevée pendant l'exécution

J'ai essayé abaisser la priorité du fil:

System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

J'ai aussi essayé de définir la classe de priorité

Process p = Process.GetCurrentProcess(); 
p.PriorityClass = ProcessPriorityClass.BelowNormal; 

Je pensais aussi que l'utilisation du processeur aurait pu être élevé en raison de l'exécution sur une machine virtuelle. Mais cette théorie ne m'a emmené nulle part. C'est plutôt ridicule. Je ne sais pas où aller d'autre. Je ne sais pas pourquoi démarrer une minuterie ou un thread enverrait mon utilisation du processeur à travers le plafond comme dans le framework .NET. Je n'ai jamais ressenti cela lors de la construction d'objets COM. Est-ce que quelqu'un a des idées brillantes quant à l'endroit où je peux me tourner?

Merci pour votre temps à l'avance.

Répondre

2

Si vous bouclez plusieurs fois dans votre thread, cela peut certainement provoquer une utilisation élevée du processeur. Avez-vous essayé d'ajouter une pause à l'exécution de votre thread entre les boucles?

Thread.Sleep(1000); 
+0

Le Thread.Sleep (1000) m'a aidé à donner un sens à tout. Le vrai programme est quelque peu complexe. Cela fait partie du très petit programme que j'ai écrit: System.Threading.Thread th = nouveau System.Threading.Thread (nouveau ThreadStart (ThreadFunc)); th.Priority = ThreadPriority.Lowest; th.Start(); public static void ThreadFunc() { System.Threading.Thread.Sleep (10000); ou (long i = 0; i <1000000000; i ++) {} System.Threading.Thread.Sleep (10000); } –

+0

L'intention du programme original était de traiter l'information, mais elle doit fonctionner souvent (par exemple, 1/2 heure ou une heure). Je vois le planificateur de Windows me permet seulement de programmer une tâche seulement aussi fréquemment que tous les jours. Je pensais que j'utiliserais un fil pour suivre l'emploi du temps, mais je commence à sentir que cela ne s'avère pas très intelligent. Donc je suis ouvert aux suggestions. –

+0

Je pense que je peux faire demi-tour et utiliser un planificateur de tâches Windows au lieu d'essayer de faire mon propre truc et utiliser des threads et des minuteries afin de garder mon programme léger. Merci les gars et bien regarder. –

3

Il semble que votre code soit en boucle infiniment et de façon inattendue. Démarrez-le dans le débogueur Visual Studio et lorsque vous voyez le CPU élevé, appuyez sur "Break" pour suspendre l'exécution. Les callstacks et autres états du programme que vous voyez lorsque vous le faites à plusieurs reprises devraient vous donner une idée de ce qui ne va pas dans votre logique.

Il est possible que le passage du code dans le débogueur soit plus rapide. Cela dépend de la complexité du code.