私が理解しているように、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
か?