[英]How to keep ActionBlock running on any exception
我有一个ActionBlock
,可以简单地连续处理来自无限循环的消息。 在ActionBlock
内部,我发表了一个http帖子。 当出现任何与网络相关的错误时,该方法将引发异常,并且该块将发生故障/停止。 这不是我想要的行为。 我希望处理运行即使发生异常。 (保持点击Process
方法)模拟我的程序;
private static ExecutionDataflowBlockOptions processBlockOptions
{
get
{
return new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 1
};
}
}
static async Start()
{
processQueue = new
ActionBlock<QueueMessage>(
async (item) =>
{
await Process(item);
},
processBlockOptions);
while (!Stopped)
{
//Read from DB and do logic with item
QueueMessage item= new QueueMessage();
await processQueue.SendAsync(item);
}
}
private async static Task<int> Process(QueueMessage item)
{
try
{
await item.HttpPost(order);
}
catch (Exception ex)
{
//Http endpoint might be broken
throw ex;
}
}
您正在重新抛出异常,并且做错了:
throw ex;
如果您需要记录错误或停止管道一段时间,则无需抛出任何内容,只需登录ex.ToString()
并做出相应的反应。 第二件事是您应该使用throw;
而不是throw ex;
,因为您要重写堆栈跟踪以获取异常,这种情况实际上并不重要,但是在工作流程更加复杂的情况下可能会产生误导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.