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

smw*_*dia 2 .net task-parallel-library async-await c#-5.0 tpl-dataflow

我正在研究TPL数据流.Belwo是官方文件Stephen Toub的两段代码片段.TPL数据流简介(TPLDataflow.docx).但我并没有完全了解它们之间的区别.

顺便说一句,这两个代码片段是来自文档的样本,用于演示目的.他们不完整.

  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");
    
    Run Code Online (Sandbox Code Playgroud)
  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");
    
    Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

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

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

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

您可能会发现我的async/ await介绍很有帮助.