我的问题标题说明了一切。
我正在寻找一个不需要输入的TPL数据流块。
现在我正在使用变换块,但它的输入未使用。
答案 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)
来启动您的管道。