如何在任何异常上运行ActionBlock

时间:2017-07-19 08:14:35

标签: c# async-await task task-parallel-library tpl-dataflow

我有一个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;
    }
}

1 个答案:

答案 0 :(得分:3)

您重新抛弃了异常,并且您做错了:

throw ex;

如果您需要记录错误或停止管道一段时间,您不需要抛出任何东西,只需记录ex.ToString()并做出相应的反应。第二件事是您应该使用throw;而不是throw ex;,因为您正在重写堆栈跟踪以获取异常,这在这种情况下并不重要但在案例中可能会产生误导更复杂的工作流程。