1

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

4

1 に答える 1

0

私と同じ問題に直面している方のために、このバグはHangfire 1.4.7で修正されました。

変更セットに従って、Hangfire はが でInnerExceptionはないことをチェックするようになりましたTaskCanceledException

于 2015-10-02T05:58:25.053 に答える