我需要從外部系統檢索多個對象。外部系統支持多個同時發生的請求(即線程),但是可能使外部系統氾濫 - 因此我希望能夠異步地檢索多個對象,但我希望能夠限制同時發生的異步請求數量。即我需要檢索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);
}