【问题标题】:Parallel I/O queries with progress updates具有进度更新的并行 I/O 查询
【发布时间】:2015-03-12 07:35:20
【问题描述】:

我有一个 mvc5 控制器,它使用两个分页的远程数据服务。这两个服务必须串联调用——当从serviceA返回一页数据时,它必须发送给serviceB。我幼稚的完全串行实现如下所示:

var pageNumber = 1;
var totalPages = x;
var results = new List<ProcessedResult>();
do {
    // Get results from service A.
    var initialResults = await serviceA.GetDataPageAsync(pageNumber);

    // Send serviceA's results to service B
    var processedResults = await serviceB.ProcessAsync(initialResults );

    // Save this iteration's results to our result collection.
    results.AddRange(processedResults); 

    //Report our progress so far
    ReportProgress((float)(pageNumber/totalPages)*100);

} while (pageNumber<totalPages);

return View(results)

如何开始并行(或异步)查询“页面”而不中断延续(每个页面的 serviceB 都遵循 serviceA)或进度报告?谢谢。

【问题讨论】:

  • 将循环体提取到一个单独的async 函数中,为每个页面调用一次,收集结果任务和WaitAllWhenAll。至于报告,不要发送百分比,发送增量,让ReportProgress函数计算百分比

标签: c# asynchronous parallel-processing asp.net-mvc-5 task-parallel-library


【解决方案1】:

您可以为此使用 TPL 数据流。您使用其操作和选项(如MaxDegreeOfParallelism)创建每个块,并将它们与LinkTo 连接在一起:

var aBlock = new TrasnformBlock<int, InitalResult>(
    pageNumber =>  serviceA.GetDataPageAsync(pageNumber),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5});
var bBlock = new TrasnformBlock<InitalResult, ProcessedResult>(async initialResult =>  
{
    var result = await serviceB.ProcessAsync(initialResult);
    // ReportProgress
    return result;
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5});   

aBlock.LinkTo(bBlock, new DataflowLinkOptions { PropagateCompletion = true })

for (int pageNumber = 1; pageNumber < totalPages; pageNumber++)
{
    aBlock.Post(pageNumber);
}

aBlock.Complete();
await aBlock.Completion;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2011-05-02
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多