我需要从外部系统检索多个对象。外部系统支持多个同时发生的请求(即线程),但是可能使外部系统泛滥 - 因此我希望能够异步地检索多个对象,但我希望能够限制同时发生的异步请求数量。即我需要检索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);
}