Hochfrequenz-Abfrageschleife in C#?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Hochfrequenz-Abfrageschleife in C#?

Post by Guest »

Ich versuche, eine Hochfrequenz-Abfrageschleife in C# zu erstellen, aber ich habe Probleme mit der Genauigkeit und der CPU-Auslastung.
Beispiel 1 schläft mehr als 1 ms pro Iteration. Stattdessen dauert es ungefähr 15 Millisekunden pro Iteration, was meiner Meinung nach an der Windows-Taktauflösung liegt.
Beispiel 2 ist genau, aber die CPU-Auslastung ist relativ hoch. Dies scheint eine Auslastungsschleife zu sein, die ich mit Thread.Sleep(0) oder Thread.Yield() zu beheben versucht habe, aber die CPU-Auslastung ist nicht viel geringer.Gibt es eine Möglichkeit, eine Schleife mit einer hohen Abfragerate zu erstellen, die genau ist (d. h. nicht von der 15-ms-Ungenauigkeit beeinträchtigt wird) und keine CPU-Ressourcen beansprucht?
< pre class="lang-cs Prettyprint-Override">

Code: Select all

// Assume my loop is supposed to be 1000hz (1ms per iteration)

void Example1()
{
int i = 0;

// Sleeps for 15ms instead of 1ms.
while(true)
{
i++;
Thread.Sleep(1);
}
}

void Example2()
{
Stopwatch stopwatch = Stopwatch.StartNew();
long prevElapsed = 0;

int i = 0;

while (true)
{
// Accurate to 1ms but relative high CPU usage
// for just incrementing a counter 1000 times per sec.
if (stopwatch.ElapsedMilliseconds - prevElapsed >= 1)
{
i++;
prevElapsed = stopwatch.ElapsedMilliseconds;
}
}
}
Ich habe verschiedene Methoden ausprobiert, aber keine war sowohl genau (nahe 1 ms pro Iteration) als auch CPU-effizient:
  • Code: Select all

    Thread.Sleep(1);
    (ungenau)
  • Code: Select all

    await Task.Delay(1);
    (ungenau)
  • Code: Select all

    System.Timers.Timer;
    (ungenau)
  • Code: Select all

    System.Threading.Timer;
    (ungenau)
  • Code: Select all

    Stopwatch
    mit Thread.Yield() oder Thread.Sleep(0) (genau, aber relativ hohe CPU-Auslastung)
Gibt es eine Möglichkeit, dies zu erreichen? eine hohe Abfragerate, bei der jede Iteration näher an einer Millisekunde liegt, ohne die CPU zu belasten oder sich auf Methoden zu verlassen, die von der Taktauflösung des Betriebssystems beeinflusst werden?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post
  • Hochfrequenz-Abfrageschleife in C#?
    by Guest » » in C#
    0 Replies
    4 Views
    Last post by Guest