2015-09-18 60 views
1

據我瞭解,Hangfire目前還不支持異步方法。作爲一種解決方法,我使用中的AsyncContext.Run()來包裝我的異步方法調用,以使其看起來像從Hangfire的角度來看是同步的。異常似乎正如預期的那樣正確地冒出來(從AggregateException解包)。TaskCanceledException導致Hangfire作業無限期處於處理狀態

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

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

然而,當TaskAsync拋出TaskCanceledException,遲髮型不正確標記爲 「失敗」。相反,它會嘗試再次處理這項工作。如果TaskAsync繼續投擲TaskCanceledException,它將無限期停留在該狀態,而不是像平常一樣停止重試10次。

這似乎是因爲Hangfire將OperationCanceledException視爲自己的控制流程,而不是將其視爲來自工作的異常。例如herehere

除了用catch TaskCanceledException包裝我所有的Hangfire作業之外,有什麼辦法可以解決嗎?

+0

我喜歡你如何呈現你的問題。重新修改一下:_「Hangfire不支持'async'方法,但是」_:除了你和編譯器之外,沒有人能看到'async'關鍵字。這只是編譯器執行某些代碼轉換的指令,而不是方法簽名的一部分。如果說Hangfire還不支持異步(無代碼格式化!)方法,也就是那些返回「任務」或「任務」的方法,那可能會更加正確。 – stakx

回答

0

對於那些和我一樣面臨同樣問題的人,這個bug已經在Hangfire 1.4.7中修復。

根據變更集,Hangfire現在檢查InnerException不是TaskCanceledException