Как сохранить ActionBlock работающим на любом исключении

У меня есть 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 ответ

Решение

Вы перебрасываете свои исключения, и вы делаете это неправильно:

throw ex;

Если вам нужно зарегистрировать ошибки или остановить конвейер на некоторое время, вам не нужно ничего бросать, просто войдите ex.ToString() и реагировать соответственно. Второе, что вы должны использовать throw; вместо throw ex;, поскольку вы переписываете трассировку стека для исключения, что не имеет большого значения в этом случае, но может вводить в заблуждение в случае более сложного рабочего процесса.

Другие вопросы по тегам