【发布时间】:2017-12-13 19:46:24
【问题描述】:
我正在开发一个项目,该项目需要出现,这是 TPL 数据流的完美场景。由于在这方面的经验相对有限(而且我之前做过的事情),我一直在通过阅读微软的文档以及我可以在网上找到的文章来复习它。
完成后,我构建了我的代码以将一系列块链接在一起(主要是 TransformBlock 并以 ActionBlock 结尾,执行以下操作:
var block1 = new TransformBlock<T, U>(async input => {});
var block2 = new TransformBlock<U, V>(async input => {});
var block3 = new ActionBlock<V>(async input => {});
block1.LinkTo(block2);
block2.LinkTo(block3);
foreach(var item in items)
{
await block1.SendAsync(item);
}
block1.Complete();
await block3.Completion;
一篇文章(我找不到)中有人建议管道中应该有后续任务来将块标记为完成。这是他们为此提供的代码。
// Create the continuation tasks in the pipeline that marks each block as complete.
await block1.Completion.ContinueWith(t =>
{
if (t.IsFaulted) { ((IDataflowBlock)block2).Fault(t.Exception); }
else { block2.Complete(); }
});
await block2.Completion.ContinueWith(t =>
{
if (t.IsFaulted) { ((IDataflowBlock)block3).Fault(t.Exception); }
else { block3.Complete(); }
});
我承认我并不完全理解这段代码在做什么以及是否需要它。当我尝试在我刚刚编写的代码中运行它时,代码挂在第一个 ContinueWith 上,并且永远无法运行管道。
我希望得到额外的解释,因为我想更好地了解这里发生的事情的细微差别。
【问题讨论】:
-
您不应该对每个问题提出多个单独的问题。此外,解释某些概念的全部内容过于宽泛。你应该问一个单一的、具体的问题。
-
@Servy 我删除了我的第一个问题。你建议如何问第二部分?我提供了一段代码,我不明白为什么有人说它很重要(文章也没有解释)。在这一点上,我还没有找到/阅读任何可以帮助我更好地理解它的东西。
-
你没有找到任何关于完成块的工作原理,你需要人们向你解释所有竞争如何进行的细微差别?对于第一部分,有大量关于完成块的工作原理的信息,对于第二部分,这又是太宽泛了。
-
我没有说我没有找到任何东西......我说我不理解文章中的那段代码。我提供了具体的代码。 @JSteward 提供了一个很好的答案,我相信他的链接为上面的特定代码提供了更多详细信息,以便提供帮助。也许我的 Google-fu 完全失败了。我将来会努力提出一个更清晰的问题,但有人能够为我指出正确的方向。谢谢。
标签: c# task-parallel-library tpl-dataflow