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