2012-01-03 11 views
5

Chciałbym wdrożyć dobry algorytm przepustnicy przez. W (C# lub VB), ale nie mogę dowiedzieć się, jak mógłbym to zrobić..NET Algorytm przepustnicy

Sprawa to moja witryna asp.net powinna publikować żądania na innej stronie internetowej w celu pobrania wyników. Należy przesłać maksymalnie 300 żądań na minutę.

Jeśli żądania przekraczają limit 300, druga strona Api nic nie zwraca (co jest czymś, czego nie chciałbym użyć jako czek w moim kodzie).

P.S. Widziałem rozwiązań w innych językach niż .net, ale jestem nowicjuszem i proszę być miły i zachować swoje odpowiedzi tak proste jak 123.

Dziękuję

+1

Możliwy duplikat [Throttling asynchronous tasks] (http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

Odpowiedz

5

Można mieć prostą aplikację (lub sesji) i klasy sprawdź, czy dla trafień. Jest coś niezwykle szorstki tylko dać pomysł:

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

Najprostszym sposobem jest po prostu do czasu, jak długo jest ona między pakietami i nie pozwalał im być wysyłane z szybkością więcej niż jeden raz na 0,2 sekundy. Oznacza to, że nagraj czas, kiedy jesteś wezwany i kiedy jesteś następny, sprawdź, czy przynajmniej 200ms zostało usunięte lub nic nie zwrócisz.

To podejście zadziała, ale będzie działać tylko dla płynnych przepływów pakietów - jeśli spodziewasz się serii działań, możesz chcieć pozwolić na 5 wiadomości w dowolnym okresie 200ms, o ile średnia powyżej 1 minuty to nie więcej niż 300 połączenia. W takim przypadku możesz użyć tablicy wartości do przechowywania "znaczników czasu" ostatnich 300 pakietów, a za każdym razem, gdy odbierzesz połączenie, możesz spojrzeć wstecz na "300 połączeń", aby sprawdzić, czy minęła co najmniej 1 minuta .

Dla obu tych schematów wartości czasu zwracane przez Environment.TickCount będą odpowiednie dla twoich potrzeb (rozpiętości nie mniejsze niż 200 milisekund), ponieważ są dokładne do około 15 ms.