TPL数据流。无法将BatchBlock附加到ActionBlock。无法从使用中推断出类型参数?

时间:2013-07-21 14:45:47

标签: c# visual-studio-2012 task-parallel-library .net-4.5 tpl-dataflow

我将此批处理块作为

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 ???

1 个答案:

答案 0 :(得分:2)

LinkTo扩展方法的类型签名应该揭示错误:

LinkTo<TOutput>(ISourceBlock<TOutput>, ITargetBlock<TOutput>)

您指定BatchBlock<T>作为来源,ActionBlock<T>作为目标,通用类型TIEnumerable<string>。但是,前者实现ISourceBlock<T[]>,而后者实现ITargetBlock<T>;因此,它们与LinkTo方法的参数不一致,后者期望它们具有相同的类型。

要解决此问题,您需要将actionBlock的签名(和实施)更改为:

var actionBlock = new ActionBlock<IEnumerable<string>[]>(enumerables => ...
                                                  // ^ accept an array of enumerables