TPL数据流:这两个代码片段之间的区别是什么?

时间:2013-04-07 06:35:48

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

我正在研究TPL Dataflow。 Belwo是官方文档Stephen Toub. Introduction to TPL Dataflow (TPLDataflow.docx) 中的2段代码片段。但我并没有完全了解它们之间的区别。

顺便说一句,这两个代码片段是文档中的样本,用于演示目的。它们并不完整。

  1. 按顺序下载图像并同步

    var downloader = new ActionBlock<string>(url =>
    {
        // Download returns byte[]
        byte [] imageData = Download(url); 
        Process(imageData);
    });
    
    downloader.Post("http://msdn.com/concurrency");
    downloader.Post("http://blogs.msdn.com/pfxteam");
    
  2. 按顺序下载图像并异步

    var downloader = new ActionBlock<string>(async url =>
    {
        byte [] imageData = await DownloadAsync(url);
        Process(imageData);
    });
    
    downloader.Post("http://msdn.com/concurrency ");
    downloader.Post("http://blogs.msdn.com/pfxteam");
    

1 个答案:

答案 0 :(得分:6)

在您的第一个示例中,对于发布的每个数据,ActionBlock会将其委托排队到线程池。 Download将阻塞线程池线程,然后在同一个线程池线程上执行Process

在第二个示例中,对于发布的每个数据,ActionBlock将其委托排队到线程池。 await将异步等待下载,因此线程池线程在下载期间返回到线程池。下载完成后,方法的其余部分将排队到线程池,Process将在线程池线程上执行。

因此,在一般情况下,第二个例子更有效。

您可能会发现我的async/await intro有帮助。