Beispiel 1: Die Schleife schläft etwa 15,6 ms lang , anstelle der angegebenen 1 ms pro Iteration. Ich habe herausgefunden, dass dies aufgrund der Windows-Taktauflösung beabsichtigt ist.
Beispiel 2: Die Schleife ist genau, hat aber eine relativ hohe CPU-Auslastung. Dies scheint eine Auslastungsschleife zu sein, die ich mit Thread.Sleep(0) oder Thread.Yield() zu beheben versucht habe, aber die CPU-Auslastung bleibt relativ hoch.
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?
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;
}
}
}
[*]
Code: Select all
Thread.Sleep(1);
[*]
Code: Select all
await Task.Delay(1);
[*]
Code: Select all
System.Timers.Timer;
[*]
Code: Select all
System.Threading.Timer;
[*]
Code: Select all
Stopwatch
< /ul>
Gibt es eine Möglichkeit, eine hohe Abfragerate zu erreichen, 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?