TaskCanceledException导致Hangfire作业无限期处于Processing状态

TaskCanceledException causes Hangfire job to be in Processing state indefinitely

据我了解,Hangfire 还不支持异步方法。作为一种解决方法,我用 AsyncContext.Run()AsyncEx 包装了我的异步方法调用,以使其从 Hangfire 的角度来看看起来是同步的。异常似乎按预期正确冒泡(从 AggregateException 展开)。

    public void Task()
    {
        AsyncContext.Run(() => TaskAsync());
    }

    private async Task TaskAsync()
    {
        //...
    }

然而,当 TaskAsync 抛出 TaskCanceledException 时,Hangfire 没有正确地将其标记为 "Failed"。相反,它将尝试再次处理该作业。如果 TaskAsync 继续抛出 TaskCanceledException,它将无限期地卡在该状态,而不是像往常一样在 10 次后停止重试。

好像是因为Hangfire把OperationCanceledException当成自己的控制流,而不是当成作业产生的异常。例如here, and here.

除了用 catch TaskCanceledException 包装我所有的 Hangfire 作业之外,还有什么办法可以解决这个问题吗?

对于那些遇到与我相同问题的人,此错误已在 Hangfire 1.4.7 中修复。

根据变更集,Hangfire 现在会检查 InnerException 不是 TaskCanceledException