У меня есть много запросов на отправку на сервер (API рекламы продукта Amazon), однако этот сервер не позволяет мне отправлять более 1 запроса каждую секунду. Я ищу бесплатное решение на основе возможностей C#.Как реализовать ограниченные вызовы API в многопоточной среде?
Я попытался написать код так:
public static WebResponse Request(Dictionary<string, string> parameters) {
var response = LaunchRequest(parameters);
Sleep(1000);
return response;
}
Проблема заключается в том, что несколько потоков ввода в методе «Запрос» в то же время. Если есть 4 потока, тогда будет 4 запроса в секунду.
Как мои потоки могут ждать друг друга?
EDIT: Я попытался с замком.
Так что я написал этот код:
public class RequestHandler {
private static readonly RequestHandler instance = new RequestHandler();
private Object thisLock = new Object();
private RequestHandler() { }
public static RequestHandler Instance {
get {
return instance;
}
}
public WebResponse Request(Dictionary<string, string> parameters) {
lock (thisLock) {
Log();
var response = LaunchRequest(parameters);
Sleep(1000);
return response;
}
}
}
Так я называю мой метод, как это:
// ...
RequestHandler requestHandler = RequestHandler.Instance;
WebResponse response = requestHandler.Request(requestHelper, parameters);
// ...
Это, кажется, работает большую часть времени, но иногда, мой «LaunchRequest» метод стреляли почти в одно и то же время.
EDIT 2: Ниже приведены результаты журнала, стрелки показывают те вызовы, где есть меньше, чем 1 секунда:
Request: 09:52:50.230 - Thread 22
Request: 09:52:48.830 - Thread 5
Request: 09:52:47.468 - Thread 10 <---
Request: 09:52:47.331 - Thread 13 <---
Request: 09:52:45.971 - Thread 12
Request: 09:52:44.767 - Thread 11
Request: 09:52:43.230 - Thread 5
Request: 09:52:30.546 - Thread 21 <---
Request: 09:52:30.357 - Thread 20 <---
Request: 09:52:29.232 - Thread 13
Request: 09:52:27.908 - Thread 11
Request: 09:52:26.471 - Thread 5
Request: 09:52:25.138 - Thread 11
Request: 09:52:23.835 - Thread 12
https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – trailmax
Также это может быть более читаемым: https://www.dotnetperls.com/lock – trailmax
Я редактировал свой пост с новой реализацией , используя блокировку, но все еще есть проблема. – Lawi