usando await Task.Delay in una prestazione per kills

usando await Task.Delay in una prestazione per kills

Task.Delay è leggero ma non preciso. Poiché il ciclo senza ritardi si completa molto più velocemente, sembra che il thread sia inattivo e stia utilizzando un sistema operativo inattivo per attendere che scada il timer. Il timer viene controllato in base al quantum di pianificazione del thread del sistema operativo (nello stesso gestore di interrupt che esegue la prelazione del thread), che è di 16 ms per impostazione predefinita.

Puoi ridurre il quantum con timeBeginPeriod , ma un approccio migliore (più efficiente dal punto di vista energetico) se hai bisogno di una limitazione della velocità piuttosto che di un tempismo esatto è tenere traccia del tempo trascorso (il Stopwatch la classe va bene per questo) e il numero di chiamate effettuate e ritardare solo quando le chiamate effettuate hanno raggiunto il tempo trascorso. L'effetto complessivo è che il tuo thread si riattiverà circa 60 volte al secondo e inizierà alcuni elementi di lavoro ogni volta che lo fa. Se la tua CPU è impegnata con qualcos'altro, inizierai elementi di lavoro extra quando riprenderai il controllo, anche se è anche abbastanza semplice limitare il numero di elementi avviati contemporaneamente, se è quello che ti serve.

public async Task Generate(int numberOfCallsPerSecond) 
{
    var elapsed = Stopwatch.StartNew();
    var delay = TimeSpan.FromMiliseconds(1000/numberOfCallsPerSecond); // a call should happen every 1000 / numberOfCallsPerSecond miliseconds
    for (int i=0; i < numberOfcallsPerSecond; i++) 
    {
        Call();  // don't wait for result here
        int expectedI = elapsed.Elapsed.TotalSeconds * numberOfCallsPerSecond;
        if (i > expectedI) await Task.Delay(delay);
    }
}