是否存在不接受输入但返回输出的TPL数据流块?

时间:2016-07-05 08:42:17

标签: c# multithreading asynchronous task-parallel-library tpl-dataflow

我的问题标题说明了一切。

我正在寻找一个不需要输入的TPL数据流块。

现在我正在使用变换块,但它的输入未使用。

2 个答案:

答案 0 :(得分:3)

我将从BufferBlock<T>构建一个这样的块:该方法接受一个委托,该委托呈现块的ITargetBlock<T>侧并返回它的ISourceBlock<T>面。这样,委托可以向块发送输入,但是从外部看,它看起来像只生成输出的块。

代码:

public static ISourceBlock<T> CreateProducerBlock<T>(
    Func<ITargetBlock<T>, Task> producer,
    int boundedCapacity = DataflowBlockOptions.Unbounded)
{
    var block = new BufferBlock<T>(
        new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity });

    Task.Run(async () =>
    {
        try
        {
            await producer(block);

            block.Complete();
        }
        catch (Exception ex)
        {
            ((IDataflowBlock)block).Fault(ex);
        }
    });

    return block;
}

使用示例:

var producer = CreateProducerBlock<int>(async target =>
{
    await target.SendAsync(10);
    await target.SendAsync(20);
});

ITargetBlock<int> consumer = …;

producer.LinkTo(consumer);

答案 1 :(得分:0)

有时最简单的方法是使用一次性 bool 作为 TransformManyBlock 的输入,并使用 .Post(true) 来启动您的管道。