[英]Producer Consumer in C# with multiple (parallel) consumers and no TPL Dataflow
[英]TPL Dataflow Consumer to Process Multiple Items at a time
我需要遍歷一個大列表,對於每個項目,都需要調用一個Web服務來獲取一些數據。 但是,我想限制對WS的請求數量,以使在任何一次執行的並發請求不超過5個。 對WS的所有調用都使用async/await
。 我正在使用BoundedCapacity
為5的TPL數據流BufferBlock
。一切正常,但是我要注意的是,等待WS調用的使用者將隊列阻塞,直到隊列結束為止,導致該緩沖區塊中的所有請求都按順序執行。 是否有可能讓消費者總是一次處理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);
}
}
您對TPL Dataflow的使用很奇怪。 通常,您將消耗和處理移入流程 。 附加一個TransformBlock
來調用Web服務。 刪除ConsumeValues
。
ConsumeValues
按順序執行,這根本不是您想要的。
取而代之的BoundedCapacity
我覺得您更希望MaxDegreeOfParallelism
。
您應該使用MaxDegreeOfParallelism
設置為5的ActionBlock
。您可能還想設置一個BoundedCapacity
但這是為了限制生產者而不是消費者:
var block = new ActionBlock<CustomObject>(
item => CallWebServiceAsync(item),
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 5,
BoundedCapacity = 1000
});
foreach (CustomObject value in values)
{
await block.SendAsync(value);
}
block.Complete();
await block.Completion;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.