如何处理TPL工作流程中的错误

问题描述

我创建了一个Transformblocks管道,最后以Actionblock结尾。 该管道将​​保持静态,并在服务启动时创建 并且将在客户端发出api请求时用于推送数据。

当其中一个块内部函数引发未处理的错误时,在下面的代码中说Bblock,传播完成,并在最后抛出聚合异常。但是问题是我无法在块中发送更多请求,这是在UT中发生的。它可以在实际情况下工作吗? 我不希望任何块处于不良状态,因为这会无限地阻塞消息管道,而这在UT中可以看到。

  • 如何优雅地处理块中的错误,以便下一条消息被执行而不会出现问题(不想使块处于故障状态)?

  • 我正在发送取消令牌,同时发送消息,因为这对于每个请求都是新的。 taskcancelledexception是否会使块处于故障状态?

代码

public static ClassA
{
    
    private BufferBlock<Input> requestQueue;
    private ActionBlock<Input> CBlock;
    void init()
    {
        var options = new DataflowLinkOptions { PropagateCompletion = true };
    
        this.requestQueue.LinkTo(Ablock,options);
        Ablock.LinkTo(Bblock,options);
        Bblock.LinkTo(Cblock,options);
    }

    public async Task<bool> Execute(Input input,CancellationToken cancellationToken)
    {
        try
        {
            await this.requestQueue.SendAsync(input,cancellationToken);
            await this.CBlock.Completion;
        }
        catch (Exception ex)
        {
            if (ex is AggregateException)
            {}
        }
    }
}

在上面的示例代码中。 Bblock抛出错误

解决方法

使用try catch处理任何异常是使管道保持活动状态且不进入故障状态的唯一方法。