【问题标题】:C# TransformBlock doesn't run even after calling "Complete()"即使在调用“Complete()”之后,C# TransformBlock 也不会运行
【发布时间】:2020-06-23 15:59:14
【问题描述】:

我有这段代码sn-p,尝试使用TransformBlock来启动代码执行,如下:

public static void Main(string[] args)
{
    var multiplyBlock = new TransformBlock<int, int>(x => x * 2);
    var additionBlock = new TransformBlock<int, int>(x => x + 2);
    multiplyBlock.LinkTo(additionBlock, new DataflowLinkOptions { PropagateCompletion = true });
    multiplyBlock.Post(3);
    additionBlock.Completion.ContinueWith(x => Console.WriteLine(x));

    multiplyBlock.Complete();
    additionBlock.Completion.Wait();
}

但是当我运行这段代码时,它挂起并且什么也不打印。我尝试调试它,我发现所有代码行都已完成,但在函数结束时,程序挂起。那么这里发生了什么,如何解决呢?

谢谢。

【问题讨论】:

    标签: c# task-parallel-library transform freeze tpl-dataflow


    【解决方案1】:

    您需要使用ActionBlock 来使用TransFormBlock 的输出,如下所示:

    public static void Main(string[] args)
    {
        var multiplyBlock = new TransformBlock<int, int>(x => x * 2);
        var additionBlock = new TransformBlock<int, int>(x => x + 2);
        var outputBlock   = new ActionBlock<int>(Console.WriteLine);
    
        multiplyBlock.LinkTo(additionBlock, new DataflowLinkOptions { PropagateCompletion = true });
        additionBlock.LinkTo(outputBlock,   new DataflowLinkOptions { PropagateCompletion = true });
    
        multiplyBlock.Post(3);
    
        multiplyBlock.Complete();
        outputBlock.Completion.Wait();
    }
    

    如果您只是尝试使用TransformBlock,则不会发生任何事情,因为没有任何东西可以消耗所有输出。

    这样想:TransformBlock 有一个输入和一个输出,所以输出必须以某种方式被消耗。 ActionBlock 只有一个输入,它会被 TransformBlock 的输出重复调用。 (这有点过于简单化了,但它应该可以帮助您理解接线。)

    在上面的示例中,乘法块的输出连接到加法块的输入,加法块的输出连接到输出块的输入。

    乘法块的输入必须来自某个地方,这里它来自对multiplyBlock.Post(3);的调用。

    (实际上,如果您想显式使用TransformBlock 的输出,可以通过在循环中调用TransformBlock.Receive()(或其他接收方法之一)来处理数据,但这不是必要的,因为它更容易使用 ActionBlock 来使用转换后的数据。)

    This documentation 可能对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2020-06-04
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多