据我了解,Hangfire 还不支持异步方法。作为一种解决方法,我使用 AsyncEx 包装了我的异步方法调用,以使其从 Hangfire 的角度看起来是同步AsyncContext.Run()
的。异常似乎按预期正确冒泡(从 展开AggregateException
)。
public void Task()
{
AsyncContext.Run(() => TaskAsync());
}
private async Task TaskAsync()
{
//...
}
但是,当TaskAsync
throws时TaskCanceledException
,Hangfire 不会正确地将其标记为“失败”。相反,它将尝试再次处理该作业。如果TaskAsync
继续投掷TaskCanceledException
,它将无限期地停留在该状态,而不是像往常一样在 10 次后停止重试。
似乎是因为 Hangfire 将OperationCanceledException
其视为自己的控制流,而不是将其视为源自作业的异常。例如这里和这里。
除了用 包裹我所有的 Hangfire 工作之外,有什么办法可以绕过它catch TaskCanceledException
?