TPL数据流优化

时间:2014-05-28 02:00:31

标签: c# .net task-parallel-library tpl-dataflow

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

  1. 下载字节数组
  2. 处理数据
  3. 将处理后的数据流式传输到其他位置
  4. 此流程效果很好,但偶尔会在下载文件,连接打嗝等时遇到备份。我想要做的是并行下载但仍然确保执行第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")
    

    因此,在上面的代码片段中,我希望同时下载两个网址,但重要的是第一个网址在第二个网址之前由上传程序处理。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

  

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

然后在该块上设置MaxDegreeOfParallelism,它将表现得像这样。当同时下载URL 1和2并且1在1之前完成时,它仍将等待1完成,然后将2发送到下一个块。

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