1

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

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

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

但是,当TaskAsyncthrows时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 回答