问题描述
我创建了一个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)
{}
}
}
}
解决方法
使用try catch处理任何异常是使管道保持活动状态且不进入故障状态的唯一方法。