取消数据流管道中的特定项目

Cancelling specific items in a dataflow pipeline

我正在构建一个数据流管道,其工作是处理大文件。每个文件都经过解析、分析和渲染;但是每个文件都可能采用不同的路径通过管道,具体取决于文件的类型。

此管道的用户界面包含要处理的文件列表、进度条和每个文件旁边的 "Cancel" 按钮(当然,还有一个用于添加新文件的按钮文件到队列)。当用户单击特定文件旁边的 "Cancel" 按钮时,我只想从管道中删除该文件。

不过我一定是遗漏了什么,因为我不知道该怎么做。我知道我可以取消整个块,但我不想那样做,我只想取消管道中的单个项目。那么,我错过了什么?

TPL Dataflow 不支持取消开箱即用的特定项目。

您可以自己实现,方法是在具有匹配 CancellationToken 的项目上创建一个包装器并将其发布到管道,而不仅仅是文件。然后只需在每个块中添加代码,如果令牌被取消并且该项目将快速通过则忽略该文件:

var block = new ActionBlock<FileWrapper>(wrapper => 
{
    if (wrapper.CancellationToken.IsCancelltionRequested)
    {
        return;
    }

    ProcessFile(wrapper.File);
});

这意味着您每个项目都有一个令牌,它允许您定位单个项目。