私が理解しているように、Hangfire はまだ非同期メソッドをサポートしていません。回避策として、非同期メソッド呼び出しをAsyncContext.Run()from AsyncExでラップして、Hangfire の観点から同期しているように見せました。例外は、期待どおりに正しくバブルアップされているようです (からラップ解除されAggregateExceptionます)。
public void Task()
{
AsyncContext.Run(() => TaskAsync());
}
private async Task TaskAsync()
{
//...
}
ただし、 がTaskAsyncスローされた場合TaskCanceledException、Hangfire はそれを「失敗」として正しくマークしません。代わりに、ジョブを再度処理しようとします。TaskAsyncを投げ続けると、TaskCanceledException通常のように 10 回でリトライを停止するのではなく、無期限にその状態でスタックします。
これは Hangfire がOperationCanceledExceptionジョブ由来の例外として扱うのではなく、独自の制御フローとして扱っているためと思われます。例こことここ。
すべての Hangfire ジョブを でラップする以外に、それを回避する方法はありますcatch TaskCanceledExceptionか?