c# - 是否有不接受输入但返回输出的 TPL 数据流 block ?

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

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

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

现在我正在使用一个变换 block ,但它的输入未被使用。

最佳答案

我会从 BufferBlock<T> 构建一个像这样的 block : 该方法接受一个呈现 ITargetBlock<T> 的委托(delegate) block 的一侧并返回 ISourceBlock<T>它的一侧。这样,委托(delegate)可以向 block 发送输入,但从外部看,它就像一个只产生输出的 block 。

代码:

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);

关于c# - 是否有不接受输入但返回输出的 TPL 数据流 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38198889/

相关文章:

c# - 使用 mongoDB C# 驱动程序,如何发出 runCommand?

java - 另一个 ConcurrentModificationException 问题

c++ - 加快 CSV 文件的处理速度

javascript - 异步嵌入脚本后是否需要使用 window.onReady()?

c# - 如何更快地取消任务

c# - 我能保证非引用方法不会改变数组大小 C#

python - isAlive() 是否可以在调用 start() 后立即为 False 因为线程尚未启动?

javascript - Promise.all() 中的 then 子句何时运行?

node.js - Meteor:如何将大文件流式传输和解析为异步 Node 函数?

c# - Owin OAuth 本地主机/ token 返回 404