簡體   English   中英

TPL數據流使用者可一次處理多個項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM