Насколько я понимаю, Hangfire пока не поддерживает асинхронные методы. В качестве обходного пути я обернул вызовы асинхронного метода AsyncContext.Run()
из AsyncEx, чтобы он выглядел синхронно с Взрывная точка зрения. Исключение кажется правильным, как и ожидалось (развернуто из AggregateException
).
public void Task()
{
AsyncContext.Run(() => TaskAsync());
}
private async Task TaskAsync()
{
//...
}
Однако, когда TaskAsync
выдает TaskCanceledException
, Hangfire неправильно помечает это как "Failed". Вместо этого он попытается обработать задание еще раз. Если TaskAsync
продолжит выдавать TaskCanceledException
, он застрянет в этом состоянии на неопределенный срок вместо того, чтобы прекратить повторные попытки после 10 попыток, как обычно.
Похоже, это связано с тем, что Hangfire рассматривает OperationCanceledException
как собственный поток управления, а не как исключение, возникающее в задании. например здесь и здесь.
Есть ли способ обойти это, кроме как обернуть все мои задания Hangfire с помощью catch TaskCanceledException
?
async
: никто никогда не видит ключевое словоasync
, кроме вас и компилятора. Это всего лишь инструкция компилятору для выполнения определенных преобразований кода, но не часть сигнатуры метода. Возможно, правильнее было бы сказать, что Hangfire пока не поддерживает асинхронные (без форматирования кода!) методы, то есть возвращающиеTask
илиTask<T>
. - person stakx - no longer contributing   schedule 18.09.2015