【问题标题】:TPL Dataflow: What's the difference between these 2 code snippets?TPL Dataflow:这两个代码片段有什么区别?
【发布时间】:2013-03-29 09:17:08
【问题描述】:

我正在研究TPL Dataflow。 Belwo 是来自官方文档Stephen Toub. Introduction to TPL Dataflow (TPLDataflow.docx) 的两段代码sn-p。但我并没有完全理解它们之间的区别。

顺便说一句,这 2 个代码 sn-ps 是文档中的示例,用于演示目的。它们并不完整。

  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");
    

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢斯蒂芬。在我的第一个示例中,虽然第一个发布的数据可能会阻塞线程池线程,但我认为第二个发布的数据仍然可以在另一个线程池线程上运行。所以这里涉及2个线程池线程。在我的第二个示例中,第一个线程池线程可以返回到线程池。所以可能不需要第二个线程池线程。所以可能只涉及 1 个线程池。我希望我说清楚了。但这是正确的吗?
  • 我刚刚阅读了您对 James 的评论,所以如果我设置 MaxDegreeOfParallelism = 2,则可以涉及 2 个线程池线程。
  • @smwikipedia 是的,但是同步代码会在整个下载过程中阻塞两个线程。另一方面,异步代码将只在短时间内使用两个线程(一次在下载开始时,一次在下载结束时),或者它可以在同一个线程上执行(同时保持下载并行)。
  • MaxDegreeOfParallelism 决定了可以同时处理多少个items,而不是有多少个thread会进行处理。
猜你喜欢
  • 2021-01-06
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多