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
。
据我了解,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
。