큰 목록을 반복하고 각 항목에 대해 데이터를 얻기 위해 웹 서비스를 호출해야한다는 요구 사항이 있습니다. 그러나 한 번에 5 개 이상의 동시 요청을 처리하지 못하도록 WS에 요청 수를 줄이기를 원합니다. WS에 대한 모든 호출은 async/await
을 사용하여 이루어집니다. 나는 TPL 데이터 흐름 BufferBlock
을 사용하고있다. BoundedCapacity
은 5이다. 모든 것이 제대로 작동하지만, WS 호출을 기다리는 소비자는 완결 될 때까지 버퍼 블록의 모든 요청이 순차적으로 수행되는 결과를 낳는다. . 소비자가 항상 한 번에 대기열에서 5 개의 항목을 처리하게 할 수 있습니까? 아니면 여러 소비자를 설정하거나 작업 블록을 조사해야합니까? 요약하면 5 개의 항목으로 큐를 시드하려고합니다. 한 항목이 처리 될 때마다 여섯 번째 항목이 처리되므로 처리 할 항목이 없을 때까지 항상 5 개의 동시 요청을 처리합니다. 어떤 도움 Async Producer/Consumer Queue using Dataflow한 번에 여러 항목을 처리하는 TPL Dataflow 소비자
감사 :
나는 나의 가이드로 이것을 사용했다. 다음은 코드의 단순화 된 버전입니다.//set up
BufferBlock<CustomObject> queue = new BufferBlock<CustomObject>(new DataflowBlockOptions { BoundedCapacity = 5 });
var producer = QueueValues(queue, values);
var consumer = ConsumeValues(queue);
await Task.WhenAll(producer, consumer, queue.Completion);
counter = await consumer;
//producer
function QueueValues(BufferBlock<CustomObject> queue, IList<CustomObject> values)
{
foreach (CustomObject value in values)
{
await queue.SendAsync(value);
}
queue.Complete();
}
//consumer
function ConsumeValues(BufferBlock<CustomObject> queue)
{
while (await queue.OutputAvailableAsync())
{
CustomObject value = await queue.ReceiveAsync();
await CallWebServiceAsync(value);
}
}