据我了解,Hangfire尚不支持异步方法。作为一种解决方法,我使用AsyncEx中的AsyncContext.Run()
封装了我的异步方法调用,使其看起来与Hangfire的观点同步。异常似乎正如预期的那样正确冒泡(从AggregateException
打开)。
public void Task()
{
AsyncContext.Run(() => TaskAsync());
}
private async Task TaskAsync()
{
//...
}
但是,当TaskAsync
抛出TaskCanceledException
时,Hangfire无法将其正确标记为"失败"。相反,它会尝试再次处理工作。如果TaskAsync
继续投掷TaskCanceledException
,它将无限期地停留在该状态,而不是像往常一样在10次之后停止重试。
这似乎是因为Hangfire将OperationCanceledException
视为自己的控制流,而不是将其视为源自该工作的异常。例如here和here。
除了用catch TaskCanceledException
包装所有Hangfire作业之外,有什么方法可以绕过它吗?
答案 0 :(得分:0)
对于那些与我自己面临同样问题的人,Hangfire 1.4.7已修复此错误。
根据变更集,Hangfire现在会检查InnerException
是否不是TaskCanceledException
。