2012-04-12 3 views
3

Edited out: Ursprünglich zwei Fragen, eine selbst getestet und habe die Antwort bekommen.C# limitierender Thread CPU-Auslastung

Ich erstelle einen gewundenen Leser/Schreiber, der über Dateien in einem Ordner-Set sieht. Es tut dies alle 5 Minuten oder weniger, wenn ein Benutzer es angibt.

Mein aktuelles Problem ist, dass der Thread die Dateien mit etwas zu viel Gefräßigkeit betrachten wird. Ich möchte den Thread auf maximal 30% der CPU beschränken (oder eine vom Benutzer angegebene Menge, falls sie es schneller/langsamer wollen). Der Grund dafür ist, dass dies ein Programm ist, das immer eingeschaltet sein soll, und ich möchte nicht, dass es das Surfen im Internet stört oder andere Programme gleichzeitig verwendet. Ich persönlich neige dazu, zu beachten, dass Thread-Programme, die 100% der CPU verwenden, mit anderen Programmen verschraubt werden, selbst wenn sie auf eine niedrigere Priorität eingestellt sind, und versuche dies zu vermeiden.

Ich dachte über die Verwendung von PerformanceCounter, um die CPU-Auslastung zu überprüfen, hoffentlich das Programm zu identifizieren und mehr Schlafzyklen hinzuzufügen, wenn die Leistung (der CPU als Ganzes, oder mein Programm es findet) zu starten . Ich habe keine Dokumentation über die Begrenzung der Thread-CPU-Nutzung gefunden, außer "lol, warum stören?", Zu "nicht wirklich machbar" ohne Gründe warum (was völlig in Ordnung ist - die meisten Leute wollen den Thread so schnell wie möglich erledigen und es könnte nicht sein Möglichkeit, dies in .Net oder einer anderen C# -Bibliothek zu tun.

Kennt jemand einen anderen Weg, als seine Priorität niedriger zu setzen oder mehr Overhead hinzuzufügen, indem er PerformanceCounter/einen anderen CPU-Monitor verwendet? Vielen Dank.

+2

Check out [diese] (http://stackoverflow.com/a/482622/884410) Antwort –

+0

Sind Sie sicher, dass Ihr Problem CPU-Auslastung und nicht die Disk-I/O? –

+0

@MattBurland - yup - gerade dabei, das zu posten.Ich habe gerade eine "optimale Threadpool-Tiefe für die Untersuchung von CPU-gebundenen Aufgaben" gemacht. Ich hatte 8/16/32/80/800 Threads, die auf meinen 4/8 Kernen bei 100% laufen, aber da die Pool-Threads auf 'THREAD_PRIORITY_BELOW_NORMAL' gesetzt sind, funktionierte mein Browser usw. alles gut. –

Antwort

2

Ich bin nicht sicher, wie Sie gerade den Ordner beobachten, aber ich denke, Sie sollten sich die FileSystemWatcher-Klasse (http://msdn.microsoft.com/en-us/library/system.io .filesystemwatcher.aspx).

Sie können festlegen, dass ein bestimmter Pfad für Änderungen angezeigt wird, und die CPU-Auslastung ist sehr gering. Es ist auch asynchron (Sie brauchen also nicht einmal einen separaten Thread).

+0

Danke, wahrscheinlich die beste Antwort, aber das ist durch einen Ordner/Txt-Datenbank durchlaufen und würde Datei eine große Anzahl von Dateien und Unterdateien beobachten. Wenn es zu hoch guckt, würde ich die gleiche CPU wie jede andere X-Zeit ausgeben. Wenn es zu niedrig war, dann würde es irgendwann eine Million geben. – Charles

2

Nicht sicher, ob ich dich richtig verstanden habe. Sie überprüfen die Dateien alle 5 Minuten und diese Überprüfung (oder ihre Verarbeitung) benötigt zu viel CPU-Zeit von anderen Prozessen?

Wenn ja, wie wäre es mit der Verlangsamung durch dazwischenliegende Verarbeitung (z. B. zwischen Dateien) mit Thread.Sleep?

Ich glaube nicht, dass Sie sich um eine maximale CPU-Last kümmern sollten (plus Konfiguration könnte für den Benutzer umständlich oder verwirrend sein, da es bei Multicore-CPUs nicht immer klar ist, was 100% CPU-Auslastung tatsächlich ist, ist es 100) % auf einem Kern oder 100% insgesamt?).

Die Zeit zum Pausieren/Schlafen könnte von der Zeit, die bisher verstrichen ist, und der verbleibenden Zeit, um die anderen Sachen zu machen, z. Sie könnten 10 ms pro Datei reservieren; Wenn die Verarbeitung 4 ms dauerte, schlafen Sie für 6 ms.

Wenn Sie die Dateien ständig auf Überprüfung überprüfen, stellen Sie sicher, dass Sie stattdessen eine FileSystemWatcher verwenden, die in diesem Fall Ihre Probleme lösen sollte.

0

CPU-Last selbst ist nicht schlecht, solange Sie nicht max. Sie werden nur durch die Reduzierung der Priorität des Prozesses in Ordnung sein. Wenn es andere Prozesse mit höherer Priorität gibt, werden sie priorisiert.

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