據我瞭解,Hangfire目前還不支持異步方法。作爲一種解決方法,我使用中的AsyncContext.Run()
來包裝我的異步方法調用,以使其看起來像從Hangfire的角度來看是同步的。異常似乎正如預期的那樣正確地冒出來(從AggregateException
解包)。TaskCanceledException導致Hangfire作業無限期處於處理狀態
public void Task()
{
AsyncContext.Run(() => TaskAsync());
}
private async Task TaskAsync()
{
//...
}
然而,當TaskAsync
拋出TaskCanceledException
,遲髮型不正確標記爲 「失敗」。相反,它會嘗試再次處理這項工作。如果TaskAsync
繼續投擲TaskCanceledException
,它將無限期停留在該狀態,而不是像平常一樣停止重試10次。
這似乎是因爲Hangfire將OperationCanceledException
視爲自己的控制流程,而不是將其視爲來自工作的異常。例如here和here。
除了用catch TaskCanceledException
包裝我所有的Hangfire作業之外,有什麼辦法可以解決嗎?
我喜歡你如何呈現你的問題。重新修改一下:_「Hangfire不支持'async'方法,但是」_:除了你和編譯器之外,沒有人能看到'async'關鍵字。這只是編譯器執行某些代碼轉換的指令,而不是方法簽名的一部分。如果說Hangfire還不支持異步(無代碼格式化!)方法,也就是那些返回「任務」或「任務」的方法,那可能會更加正確。 –
stakx