2

我正在研究TPL 数据流Belwo 是来自官方文档Stephen Toub的 2 段代码片段。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");
    
  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");
    
4

1 回答 1

6

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

在您的第二个示例中,对于发布的每条数据,ActionBlock都会将其委托排队到线程池。会await异步等待下载,所以在下载过程中线程池线程返回到线程池。下载完成后,该方法的其余部分将排队到线程池,并将Process在线程池线程上执行。

所以在一般情况下,第二个例子效率更高。

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

于 2013-04-07T12:45:40.157 回答