Matt L Matt L - 1 year ago 77
C# Question

How to construct a TransformManyBlock with a delegate

I'm new to C# TPL and DataFlow and I'm struggling to work out how to implement the TPL DataFlow

. I'm translating some other code into DataFlow. My (simplified) original code was something like this:

private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream)
yield return byteStream; // Plus operations on the array

And in another method I would call it like this:

foreach (byte[] myByteArray in ExtractFromByteStream(byteStream))
// Do stuff with myByteArray

I'm trying to create a
to produce multiple little arrays (actually data packets) that come from the larger input array (actually a binary stream), so both in and out are of type

I tried what I've put below but I know I've got it wrong. I want to construct this block using the same function as before and to just wrap the
around it. I got an error "The call is ambiguous..."

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

Answer Source

The compiler has troubles with inferring the types. You need to either specify the delegate type explicitly to disambiguate the call:

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

Or you can use a lambda expression that calls into that method:

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