2008-10-30 3 views
11

Ich entwickle ein C# -Programm, und ich habe eine Funktion, die zu viel CPU verbraucht. Ich würde gerne einen Weg finden, dies durch Code (nicht mit irgendeiner externen Anwendung) zu kontrollieren und den Prozentsatz der CPU-Nutzung zu beschränken. Zum Beispiel, wenn es 90% der CPU-Nutzung verwendet, um meine App nur 20% verbrauchen, auch wenn es langsamer wird. Es muss automatisch und aus der App heraus erfolgen. Wenn Sie eine Klasse bereitstellen, wäre es fantastisch.Wie schränkt man die CPU-Auslastung ein, die ein C# -Programm benötigt?

+0

Das klingt wie eine Krücke: Angriff auf das Symptom und nicht auf das Problem. Warum posten Sie nicht, was die Methode versucht, und bitten Sie uns um Hilfe bei der Optimierung der Methode. –

+1

Es könnte eine Krücke sein, aber ich kann mir ein paar Anwendungen für diese Idee vorstellen, wie zum Beispiel: Eine CPU-gebundene Hintergrundaufgabe zum Knirschen von Zahlen, ein Knoten in einer verteilten Computerumgebung von Büro-PCs, ein künstliches Intelligenzprogramm zum Überwachen und Lernen von meinem Nutzungsgewohnheiten. –

+1

Um die CPU-Auslastung auf 50% zu begrenzen, führen Sie sie mit Dual Core aus; für eine 25% -Kappe, führen Sie es auf Quad-Core: D – Alan

Antwort

16

Ich weiß nicht, ob Sie das tun können, aber Sie können die Thread-Priorität des ausführenden Threads über die Eigenschaft Priority ändern. Du würdest das einstellen durch:

Auch glaube ich nicht, dass du es wirklich bedecken willst. Wenn das Gerät sonst nicht in Betrieb ist, möchten Sie, dass es mit der Aufgabe beschäftigt ist, oder? ThreadPriority hilft dabei, dies dem Scheduler mitzuteilen.

+0

Das wird einigen helfen und ist die einzige Art, wie ich es weiß. –

+0

Dies ist der beste und einzige Weg, um es richtig zu machen. – Will

+1

Ich habe gesehen, dass Windows-Apps sich genau festlegen können ... sagen 50% der CPU. Die Fehlerrate betrug weniger als 1%. –

0

Sie können eine Schleife verlangsamen, indem Sie Thread.Sleep (Millisekunden) innerhalb der Schleife aufrufen. Das übergibt die CPU zurück an den Scheduler.

Aber "zu viel CPU verbrauchen" lässt mich denken, dass Sie mehr grundlegende Probleme haben könnten. Ist diese Threadabfrage und wartet auf etwas anderes? In diesem Fall sollten Sie die Verwendung von Ereignissen oder eines anderen kernelbasierten Signalisierungsmechanismus in Erwägung ziehen.

0

Ich denke, Sie müssen eine Art von OS-API abfragen, um herauszufinden, wie viel von der CPU verbrauchen Sie und Throttling Entscheidungen (wie Thread.Sleep) von diesem zu nehmen.