繁体   English   中英

如何在任何异常情况下保持ActionBlock运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM