Мне нужно получить несколько объектов из внешней системы. Внешняя система поддерживает несколько одновременных запросов (т. Е. Потоки), но можно затопить внешнюю систему - поэтому я хочу иметь возможность извлекать несколько объектов асинхронно, но я хочу иметь возможность дросселировать количество одновременных асинхронных запросов. т. е. мне нужно получить 100 элементов, но не хочу быть , получая более 25 из них сразу. Когда каждый запрос из 25 завершается, я хочу вызвать другое извлечение, и как только они будут завершены, я хочу вернуть все результаты в том порядке, в котором они были запрошены (т. Е. Нет смысла возвращать результаты до тех пор, пока весь вызов не будет возвращен). Есть ли рекомендованные шаблоны для такого рода вещей?Шаблон для ограничения числа одновременных асинхронных вызовов
Будет ли что-то вроде этого подходящим (псевдокод, очевидно)?
private List<externalSystemObjects> returnedObjects = new List<externalSystemObjects>;
public List<externalSystemObjects> GetObjects(List<string> ids)
{
int callCount = 0;
int maxCallCount = 25;
WaitHandle[] handles;
foreach(id in itemIds to get)
{
if(callCount < maxCallCount)
{
WaitHandle handle = executeCall(id, callback);
addWaitHandleToWaitArray(handle)
}
else
{
int returnedCallId = WaitHandle.WaitAny(handles);
removeReturnedCallFromWaitHandles(handles);
}
}
WaitHandle.WaitAll(handles);
return returnedObjects;
}
public void callback(object result)
{
returnedObjects.Add(result);
}