我正在研究TPL Dataflow。 Belwo是官方文档Stephen Toub. Introduction to TPL Dataflow (TPLDataflow.docx) 中的2段代码片段。但我并没有完全了解它们之间的区别。
顺便说一句,这两个代码片段是文档中的样本,用于演示目的。它们并不完整。按顺序下载图像并同步
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");
按顺序下载图像并异步
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");
答案 0 :(得分:6)
在您的第一个示例中,对于发布的每个数据,ActionBlock
会将其委托排队到线程池。 Download
将阻塞线程池线程,然后在同一个线程池线程上执行Process
。
在第二个示例中,对于发布的每个数据,ActionBlock
将其委托排队到线程池。 await
将异步等待下载,因此线程池线程在下载期间返回到线程池。下载完成后,方法的其余部分将排队到线程池,Process
将在线程池线程上执行。
因此,在一般情况下,第二个例子更有效。
您可能会发现我的async
/await
intro有帮助。