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

时间:2015-09-18 03:31:58

标签: hangfire

据我了解,Hangfire尚不支持异步方法。作为一种解决方法,我使用AsyncEx中的AsyncContext.Run()封装了我的异步方法调用,使其看起来与Hangfire的观点同步。异常似乎正如预期的那样正确冒泡(从AggregateException打开)。

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

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

但是,当TaskAsync抛出TaskCanceledException时,Hangfire无法将其正确标记为"失败"。相反,它会尝试再次处理工作。如果TaskAsync继续投掷TaskCanceledException,它将无限期地停留在该状态,而不是像往常一样在10次之后停止重试。

这似乎是因为Hangfire将OperationCanceledException视为自己的控制流,而不是将其视为源自该工作的异常。例如herehere

除了用catch TaskCanceledException包装所有Hangfire作业之外,有什么方法可以绕过它吗?

1 个答案:

答案 0 :(得分:0)

对于那些与我自己面临同样问题的人,Hangfire 1.4.7已修复此错误。

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