c# - TPL Dataflow. Cannot attach BatchBlock to ActionBlock. Type argument cannot be inferred from usage? -
i have batch block as
var batchblock = new batchblock<ienumerable<string>>(10000, new groupingdataflowblockoptions { cancellationtoken = cancellationtoken, taskscheduler = taskscheduler } );
and actionblock
var actionblock = new actionblock<ienumerable<string>>(enumerable => { (var = 0; < enumerable.count(); i++) { file.appendalltext(@"d:\test.log", enumerable.elementat(i)); } });
when try attach them as
batchblock.linkto(actionblock);
i error saying the type arguments method system.threading.tasks.dataflow.dataflowblock.linkto<toutput>(system.threading.tasks.dataflow.isourceblock<toutput>, system.threading.tasks.dataflow.itargetblock<toutput>)' cannot inferred usage. try specifying type arguments explicitly
and same error when this..
batchblock.linkto((actionblock<ienumerable<string>>)actionblock);
however, compiler doesn't complains when instead of attaching create new actionblock
in constructor` such as
batchblock.linkto(new actionblock<ienumerable<string>[]>(enumerable => { /* log file */ }));
can tell me doing wrong? why not letting me attach actionblock
batchblock
???
the type signature linkto
extension method should shed light on what's wrong:
linkto<toutput>(isourceblock<toutput>, itargetblock<toutput>)
you're specifying batchblock<t>
source, , actionblock<t>
target, generic type t
being ienumerable<string>
. however, former implements isourceblock<t[]>
, whilst latter implements itargetblock<t>
; thus, incompatible being specified arguments linkto
method, expects them have same type.
to fix this, need change signature (and implementation) of actionblock
to:
var actionblock = new actionblock<ienumerable<string>[]>(enumerables => ... // ^ accept array of enumerables
Comments
Post a Comment