如何使用委托构造TransformManyBlock

Mat*_*t L 4 .net c# dataflow task-parallel-library tpl-dataflow

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

private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream)
{
    yield return byteStream; // Plus operations on the array
}
Run Code Online (Sandbox Code Playgroud)

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

foreach (byte[] myByteArray in ExtractFromByteStream(byteStream))
{
    // Do stuff with myByteArray
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试了下面的内容,但我知道我错了.我想使用与以前相同的函数构造这个块,并且只是将TransformManyBlock它包裹起来.我收到一个错误"这个电话很模糊......"

var streamTransformManyBlock = new TransformManyBlock<byte[], byte[]>(ExtractFromByteStream);
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 5

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

var block = new TransformManyBlock<byte[], byte[]>(
    (Func<byte[], IEnumerable<byte[]>>) ExtractFromByteStream);
Run Code Online (Sandbox Code Playgroud)

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

var block = new TransformManyBlock<byte[], byte[]>(
    bytes => ExtractFromByteStream(bytes));
Run Code Online (Sandbox Code Playgroud)

  • @MattL第一个稍微高效,第二个稍微更具可读性.因此,由您来决定哪些更重要. (2认同)