C# 第三方物流数据流优化

C# 第三方物流数据流优化,c#,.net,task-parallel-library,tpl-dataflow,C#,.net,Task Parallel Library,Tpl Dataflow,我以这种方式设置了TPL数据流: 下载字节数组 过程数据 将处理后的数据流到另一个位置 这个流程工作得很好,但在下载文件、连接中断等时偶尔会遇到备份。我想做的是并行下载,但仍然要确保执行步骤3,以便接收方以正确的顺序获得有效负载 var broadcaster = new BroadcastBlock<string>(d => d); var downloader = new TransformBlock<string, byte[]>(async data =

我以这种方式设置了TPL数据流:

  • 下载字节数组
  • 过程数据
  • 将处理后的数据流到另一个位置
  • 这个流程工作得很好,但在下载文件、连接中断等时偶尔会遇到备份。我想做的是并行下载,但仍然要确保执行步骤3,以便接收方以正确的顺序获得有效负载

    var broadcaster = new BroadcastBlock<string>(d => d);
    
    
    var downloader = new TransformBlock<string, byte[]>(async data => {
      // Download and return data       
    });
    
    
    var processor = new TransformBlock<byte[], byte[]> (async data => {
      // Process and return data
    });
    
    
    var uploader = new ActionBlock<byte[]>(async input => {
      // Upload file to another location
    });
    
    
    broadcaster.LinkTo(downloader);
    downloader.LinkTo(processor);
    processor.LinkTo(uploader);
    
    
    broadcaster.SendAsync("http://someUrl");
    broadcaster.SendAsync("http://someOtherUrl")
    
    var-broadcaster=新广播块(d=>d);
    var downloader=newtransformblock(异步数据=>{
    //下载并返回数据
    });
    var处理器=新TransformBlock(异步数据=>{
    //处理和返回数据
    });
    var uploader=newactionblock(异步输入=>{
    //将文件上载到其他位置
    });
    LinkTo(下载程序);
    downloader.LinkTo(处理器);
    处理器.LinkTo(上传器);
    广播程序。SendAsync(“http://someUrl");
    广播程序。SendAsync(“http://someOtherUrl")
    
    因此,在上面的代码片段中,我希望两个url同时下载,但重要的是第一个url在第二个url之前由上传程序处理。有人能给我指一下正确的方向吗

    我希望两个url同时下载,但重要的是第一个url在第二个url之前由上传程序处理

    然后只需在该块上设置
    MaxDegreeOfParallelism
    ,它的行为如下所示。当URL 1和2同时下载并且2在1下载之前完成时,它仍将等待1完成,然后2才会发送到下一个块


    这可能不是最有效的方法,但它确实可以确保在管道中的所有块之间保持处理顺序。

    为什么甚至有3个转换块?你就不能用一个按顺序执行3个步骤吗?当然,但这是模块化的。除此之外,这是从实际逻辑上缩减的…好吧,但我认为这会解决你的问题。3个助手函数同样是模块化的,不那么复杂。啊,你说得对!我只是假设,一旦块被并行化,它只会维护块的执行顺序,而不会维护数据被推送的顺序。@user2339814是的,我第一次了解到这一点时也感到惊讶。