2015-11-09 22 views
4

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

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。我收到了一个错误“The call is ambiguous ...”

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

回答

5

编译器在推断类型时遇到了麻烦。您需要显式指定委托类型来澄清对呼叫:

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

或者你可以使用lambda表达式在调用这个方法:

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

谢谢。这正是我所追求的。你知道这些方法之一是否比其他方法更可取? –

+2

@MattL第一个效率稍高,第二个稍微可读。所以这取决于你决定哪个更重要。 – svick

+0

@svick效率一路。非常感谢。对于我自己的学习,你有任何可以分享的链接,可以进一步解释这一点吗? –