我将此批处理块作为
var batchBlock = new BatchBlock<IEnumerable<string>>(10000,
new GroupingDataflowBlockOptions
{
CancellationToken = cancellationToken,
TaskScheduler = taskScheduler
}
);
这个ActionBlock为
var actionBlock = new ActionBlock<IEnumerable<string>>(enumerable =>
{
for (var i = 0;
i < enumerable.Count();
i++)
{
File.AppendAllText(@"D:\Test.log",
enumerable.ElementAt(i));
}
});
当我尝试将它们作为
附加时 batchBlock.LinkTo(actionBlock);
我收到错误The type arguments for method System.Threading.Tasks.Dataflow.DataflowBlock.LinkTo<TOutput>(System.Threading.Tasks.Dataflow.ISourceBlock<TOutput>, System.Threading.Tasks.Dataflow.ITargetBlock<TOutput>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
即使我这样做,我也会得到同样的错误。
batchBlock.LinkTo((ActionBlock<IEnumerable<string>>)actionBlock);
但是,编译器不会在构造函数中附加创建新ActionBlock
而不是在
batchBlock.LinkTo(new ActionBlock<IEnumerable<string>[]>(enumerable => { /* log to file */ }));
谁能告诉我我做错了什么?为什么不让我将actionBlock
附加到batchBlock
???
答案 0 :(得分:2)
LinkTo
扩展方法的类型签名应该揭示错误:
LinkTo<TOutput>(ISourceBlock<TOutput>, ITargetBlock<TOutput>)
您指定BatchBlock<T>
作为来源,ActionBlock<T>
作为目标,通用类型T
为IEnumerable<string>
。但是,前者实现ISourceBlock<T[]>
,而后者实现ITargetBlock<T>
;因此,它们与LinkTo
方法的参数不一致,后者期望它们具有相同的类型。
要解决此问题,您需要将actionBlock
的签名(和实施)更改为:
var actionBlock = new ActionBlock<IEnumerable<string>[]>(enumerables => ...
// ^ accept an array of enumerables