我对整个主题都相当新,作为培训,我决定使用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就会停止整个过程。
答案 0 :(得分:2)
奇怪的是,那里也有“无效”的结果。
这并不奇怪。每个带输出的块都有一个输出队列。项目将按照它们到达的顺序离开此队列(这也称为FIFO)。这意味着如果$date = "9/22/58"; //user input
$search = date('d-m-Y', strtotime($date));
到达并且没有阻止接收它,则处理将停止。
最简单的解决方案是添加一个接受这些null
的块,但不对它们执行任何操作:
null