2014-09-21 14 views
5

Próbuję dowiedzieć się, jak korzystać z interfejsu API, który ma limit 5 żądań na sekundę skutecznie, nie osiągając limitu. Jeśli żądanie przekroczy limit, otrzymam odpowiedź błędu z interfejsu API. Thread.Sleep (200) nie wydaje się być właściwym rozwiązaniem, ponieważ potrzebuję wydajności.Jak używać ograniczonego API bez limitu liczby trafień?

foreach (Foo foo in fooList) 
{ 
    try 
    { 
     // Max 5 API calls per second! How? 
     ThirdPartyResponse response = ContactThirdPartyApi(foo); 

     // do something with response 
     ... 
    } 
} 

Najchętniej chciałbym skorzystać z usług pracowników w tle, ale jak mogę kontrolować numer żądania na sekundę? Próbowałem już sprawdzić na przykład Hangfire, aby rozwiązać ten problem, ale tak naprawdę nie działa w przypadku tego typu kontroli limitów.

Ponieważ mogę wystosować prośbę i wiem, kiedy otrzymam odpowiedź, powinno być możliwe śledzenie, ile osób zostało zwolnionych, i czy nie ma więcej niż 5 sekund na sekundę. Ale jak? Wszelkie sugestie są mile widziane!

+0

Co powiesz na używanie licznika czasu i licznika całkowitego? – Mephy

Odpowiedz

4

Możesz ograniczyć liczbę równoczesnych żądań za pomocą Semaphore lub SemaphoreSlim, wtedy musisz dodać element czasu, kiedy może zostać zwolniony.

Joel Fillmore has written a TimeSpanSemaphoreSlim implementation, które można włączyć do implementacji wywołań API. IIRC, połączyłem go pomyślnie z RestSharp dla poprzedniego projektu.

Możesz nieco zmodyfikować implementację na set the resolution of Thread.Sleep(1) properly.

+0

To jest po prostu idealne! Dzięki: D –

+0

Żadnych problemów, chętnie pomożemy! –

+0

Jak tego używasz? To jest coś, czego szukam jako rozwiązanie – PinoyDev

Powiązane problemy