2012-01-03 9 views
5

Vorrei implementare un buon algoritmo di accelerazione in .net (C# o VB) ma non riesco a capire come potrei farlo.Algoritmo di Throttle .NET

Il caso è il mio sito Web asp.net deve inviare richieste a un altro sito Web per recuperare i risultati. Al massimo 300 richieste al minuto devono essere inviate.

Se le richieste superano il limite di 300 l'altra parte Api non restituisce nulla (che è qualcosa che non vorrei usare come controllo nel mio codice).

P.S. Ho visto soluzioni in lingue diverse .net ma Sono un novizio e si prega di essere gentile e mantenere le vostre risposte così semplice come 123.

Grazie

+1

Possibile duplicato di [Throttling asynchronous tasks] (http://stackoverflow.com/questions/22492383/throttling-asynchronous-task) –

risposta

5

Si potrebbe avere una semplice applicazione (o della sessione) e di classe controlla quello per i colpi. Questa è una cosa estremamente pericolosa solo per darvi l'idea:

public class APIHits { 
    public int hits { get; private set; } 
    private DateTime minute = DateTime.Now(); 

    public bool AddHit() 
    { 
     if (hits < 300) { 
      hits++; 
      return true; 
     } 
     else 
     { 
      if (DateTime.Now() > minute.AddSeconds(60)) 
      { 
       //60 seconds later 
       minute = DateTime.Now(); 
       hits = 1; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
2

L'approccio più semplice è solo per il tempo quanto tempo è tra i pacchetti e non permettere loro di essere inviati a una velocità di più di uno ogni 0,2 secondi. Cioè, registra l'ora in cui sei stato chiamato e quando sarai chiamato dopo, controlla che almeno 200ms abbiano elacciato o non restituisca nulla.

Questo approccio funzionerà, ma funzionerà solo per flussi di pacchetti fluidi - se prevedi scoppi di attività, potresti voler consentire 5 messaggi in qualsiasi periodo di 200 ms purché la media su 1 minuto non sia più di 300 chiamate. In questo caso, è possibile utilizzare una matrice di valori per memorizzare i "timestamp" degli ultimi 300 pacchetti, quindi ogni volta che si riceve una chiamata è possibile tornare a "300 chiamate fa" per verificare che sia trascorso almeno 1 minuto .

Per entrambi questi schemi, i valori di tempo restituiti da Environment.TickCount sarebbero adeguati per le proprie esigenze (intervalli non inferiori a 200 millisecondi), poiché è accurato a circa 15 ms.