Как сохранить 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;
, поскольку вы переписываете трассировку стека для исключения, что не имеет большого значения в этом случае, но может вводить в заблуждение в случае более сложного рабочего процесса.