Transformblock未发布到Actionblock

时间:2016-07-09 13:10:46

标签: c# async-await system.reactive

我对整个主题都相当新,作为培训,我决定使用ReactiveExtensions和async / await提供的GREP克隆。

以下代码不会将transformblock中转换的项目传播到resultHandler。

    var flowOptions = new DataflowLinkOptions {PropagateCompletion = true};

    ....

    private static Task _searchTermInFilesAsync(Options options, 
                                                CancellationToken token,
                                                ExecutionDataflowBlockOptions executionOptions, 
                                                ActionBlock<FileSearcherResult> resultHandler,
                                                DataflowLinkOptions flowOptions)
    {
        var enumerator = new TransformManyBlock<Options, FileData>(o => _enumerateFiles(o).TakeWhile(_ => !token.IsCancellationRequested), executionOptions);

        var handleFile = new TransformBlock<FileData, FileSearcherResult>(async data => await _handleFile(options, data), executionOptions);

        enumerator.LinkTo(handleFile, flowOptions);

        handleFile.LinkTo(resultHandler, flowOptions, result => result != null);

        enumerator.Post(options);
        enumerator.Complete();

        return resultHandler.Completion;
    }

我有一个类似的方法几乎一样,唯一的区别是没有transformblock(另一种方法只用于枚举namepattern的文件)。两种方法都使用相同的resultHandler,因此我们可以假设它正常工作。

那么为什么TransformBlock没有将结果发布到resultHandler中呢?我检查了没有产生空结果。

编辑显然过滤器有问题。

  handleFile.LinkTo(resultHandler, flowOptions); //, result => result != null);

如果我发表评论,那就行了。奇怪的是,&#34; notnull&#34;结果在那里。似乎过滤器一旦返回false就会停止整个过程。

1 个答案:

答案 0 :(得分:2)

  

奇怪的是,那里也有“无效”的结果。

这并不奇怪。每个带输出的块都有一个输出队列。项目将按照它们到达的顺序离开此队列(这也称为FIFO)。这意味着如果$date = "9/22/58"; //user input $search = date('d-m-Y', strtotime($date)); 到达并且没有阻止接收它,则处理将停止。

最简单的解决方案是添加一个接受这些null的块,但不对它们执行任何操作:

null