我有一个要求,通过大名单迭代和每个项目调用Web服务来获取一些数据。 不过,我想限制请求到WS的数量说不超过5个在任一个时刻执行的并发请求。 到WS,全部电话都使用由async/await
。 我现在用的是TPL数据流BufferBlock
与BoundedCapacity
5.所有的东西都工作正常,但我所注意到的是顺序执行的消费者,其等待WS调用,块队列中,直到其完成导致在bufferblock所有请求。 是否有可能有消费者总是在一次处理5个项目从队列? 或者我需要设置多个消费者还是开始寻找到行动块? 所以,总之我想和5项种子队列中。 作为一个项目被处理第六将取而代之等等,所以我总是有5个下去,直到没有更多的项目来处理并发请求。
我用这个作为我的向导: 异步生产者/消费者队列使用数据流
谢谢你的帮助。 下面是代码的简化版本
//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);
}
}