C# 具有进度更新的并行I/O查询

C# 具有进度更新的并行I/O查询,c#,asynchronous,parallel-processing,asp.net-mvc-5,task-parallel-library,C#,Asynchronous,Parallel Processing,Asp.net Mvc 5,Task Parallel Library,我有一个mvc5控制器,它使用两页远程数据服务。这两个服务必须串联调用-当从serviceA返回一页数据时,必须将其发送到serviceB。我的naieve完全串行实现如下所示: var pageNumber = 1; var totalPages = x; var results = new List<ProcessedResult>(); do { // Get results from service A. var initialResults = await

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

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)
var pageNumber=1;
var totalPages=x;
var results=新列表();
做{
//从服务A获取结果。
var initialResults=await serviceA.GetDataPageAsync(页码);
//将服务A的结果发送给服务B
var processedResults=await serviceB.ProcessAsync(initialResults);
//将此迭代的结果保存到我们的结果集合中。
结果:AddRange(processedResults);
//报告我们迄今为止的进展情况
报告进度((浮动)(页码/总页数)*100);

}while(pageNumber您可以使用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;
var aBlock=new TrasnformBlock(
pageNumber=>serviceA.GetDataPageAsync(pageNumber),
新的ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=5});
var bBlock=new TrasnformBlock(异步initialResult=>
{
var result=await serviceB.ProcessAsync(initialResult);
//报告进展
返回结果;
},新的ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=5});
LinkTo(bBlock,newdataflowlinkoptions{PropagateCompletion=true})
对于(int pageNumber=1;pageNumber
将循环体提取到一个单独的
async
函数中,为每个页面调用一次,收集生成的任务,并在所有任务上执行
WaitAll
whalll
操作。至于报告,不要发送百分比,发送增量,让
ReportProgress
函数计算百分比