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

本文关键字:数据流 管道 取消 | 更新日期: 2023-09-27 18:02:03

我正在构建一个数据流管道,其工作是处理大文件。每个文件都被解析、分析和呈现;但是,根据文件的类型不同,每个文件在管道中可能采用不同的路径。

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

我一定是错过了什么,因为我不知道如何做到这一点。我知道我可以取消整个块,但我不想那样做,我只想取消管道中的单个项。那么,我错过了什么呢?

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

TPL Dataflow不支持开箱取消特定项

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

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

这意味着您每个项目有一个令牌,允许您针对单个项目。