如何使用委托构造 TransformManyBlock

Posted

技术标签:

【中文标题】如何使用委托构造 TransformManyBlock【英文标题】:How to construct a TransformManyBlock with a delegate 【发布时间】:2016-02-10 01:44:26 【问题描述】:

我是 C# TPL 和 DataFlow 的新手,我正在努力研究如何实现 TPL DataFlow TransformManyBlock。我正在将其他一些代码翻译成 DataFlow。我的(简化的)原始代码是这样的:

private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream)

    yield return byteStream; // Plus operations on the array

在另一种方法中,我会这样称呼它:

foreach (byte[] myByteArray in ExtractFromByteStream(byteStream))

    // Do stuff with myByteArray

我正在尝试创建一个TransformManyBlock 来生成来自较大输入数组(实际上是二进制流)的多个小数组(实际上是数据包),因此输入和输出都是byte[] 类型。

我尝试了下面的内容,但我知道我做错了。我想使用与以前相同的函数来构造这个块,并将TransformManyBlock 包裹在它周围。我收到一个错误“电话不明确...”

var streamTransformManyBlock = new TransformManyBlock<byte[], byte[]>(ExtractFromByteStream);

【问题讨论】:

【参考方案1】:

编译器在推断类型时遇到问题。您需要明确指定委托类型以消除调用歧义:

var block = new TransformManyBlock<byte[], byte[]>(
    (Func<byte[], IEnumerable<byte[]>>) ExtractFromByteStream);

或者您可以使用调用该方法的 lambda 表达式:

var block = new TransformManyBlock<byte[], byte[]>(
    bytes => ExtractFromByteStream(bytes));

【讨论】:

谢谢。这正是我所追求的。您知道其中一种方法是否比另一种更可取吗? @MattL 第一个效率更高,第二个可读性更高。因此,由您决定哪个更重要。 @svick 效率一路走好。非常感谢。对于我自己的学习,您是否可以分享任何可以进一步解释这一点的链接? @MattL 在this question中有一些解释。

以上是关于如何使用委托构造 TransformManyBlock的主要内容,如果未能解决你的问题,请参考以下文章

[C++11]委托构造函数

委托构造函数详解,小白也可以看懂

[C++11 类的改进] --- 继承构造函数和委托构造函数

具有聚合初始化的 C++11 构造函数委托

[C++11 类的改进] --- 继承构造函数和委托构造函数

[C++11 类的改进] --- 继承构造函数和委托构造函数