1

我有这个批处理块

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在构造函数中附加一个 create a new ,例如

batchBlock.LinkTo(new ActionBlock<IEnumerable<string>[]>(enumerable => { /* log to file */ }));

谁能告诉我我做错了什么?为什么它不让我附上我actionBlockbatchBlock???

4

1 回答 1

2

扩展方法的类型签名LinkTo应该可以说明问题所在:

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

您将 a 指定BatchBlock<T>为源,将 a 指定ActionBlock<T>为目标,泛型类型TIEnumerable<string>. 但是,前者执行ISourceBlock<T[]>,而后者执行ITargetBlock<T>;因此,它们与被指定为方法的参数不兼容,该LinkTo方法期望它们具有相同的类型。

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

var actionBlock = new ActionBlock<IEnumerable<string>[]>(enumerables => ...
                                                  // ^ accept an array of enumerables 
于 2013-07-21T15:38:00.630 回答