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

9
我正在构建一个 Dataflows 管道,其工作是处理大型文件。每个文件都会被解析、分析和渲染;但每个文件可能会根据其类型在管道中走不同的路径。
此管道的用户界面包括要处理的文件列表、进度条和每个文件旁边的“取消”按钮(当然还有一个添加新文件到队列的按钮)。当用户点击特定文件旁边的“取消”按钮时,我希望仅从管道中移除该文件,而不是整个块。
但我似乎漏掉了一些关键步骤,因为我不知道如何做到这一点。我知道我可以取消整个块,但我不想这样做,我只想取消管道中的单个项目。那么,我漏掉了什么?

1
你是如何实现这个流水线的?有些代码可以帮助吗? - Orion_Eagle
抱歉,根据您的标签,您可能正在使用System.Threading.Tasks.Dataflow。 - Orion_Eagle
请查看此链接,如果您能够将单独的CancellationTokenSource传递给每个TransformBlock,则可以帮助单独取消它们。 - Orion_Eagle
1个回答

10

TPL Dataflow不支持直接取消特定项。

您可以通过创建一个包装器,在其中使用匹配的 CancellationToken 并将其发布到管道中,来自行实现它。然后,在每个块中添加代码以忽略该文件(如果令牌被取消),则该项将会快速通过:

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

    ProcessFile(wrapper.File);
});
这意味着您每个项目有一个令牌,可以让您针对单个项目进行定位。

1
谢谢,那很有道理。我考虑过传递自己的标志,但你的想法更好。 - Bugmaster
我认为这正是我所需要的,但我不确定如何在上面的示例中定义FileWrapper对象。 - PastExpiry.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接