我有幾種方法需要某種互聯網連接。如果連接失敗,我想在失敗之前重試該方法一段時間。由於應用程序可以在等待成功響應的同時繼續運行,我希望異步執行此操作。爲什麼在使用Polly的後續重試中HttpClient會繼續失敗?
我使用Polly (5.3.1)來實現異步重試邏輯,利用Tasks
。
我在禁用Wi-Fi的情況下啓動進程並在重試窗口中啓用進程來模擬斷開連接。我期待在再次啓用我的連接後,重試時方法會成功,我所看到的是該方法繼續拋出HttpRequestException
,就好像連接已關閉,直到重試完成,然後拋出給調用者。
如果我以正常啓用Wi-Fi的方式啓動該方法,它將立即成功。
// Get the HTML of a web page 'async'
public async Task<string> GetHtmlAsync(string url)
{
using (var client = new HttpClient())
using (var response = await client.GetAsync(url))
{
response.EnsureSuccessStatusCode();
using (var content = response.Content)
{
return await content.ReadAsStringAsync();
}
}
}
// Wrapper for Polly to create an async retry policy
public async Task<TResult> RetryAsync<TResult, TException>(Task<TResult> task, int retries, int seconds) where TException : Exception
{
return await Policy
.Handle<TException>()
.WaitAndRetryAsync(retries, wait => TimeSpan.FromSeconds(seconds))
.ExecuteAsync(async() => await task);
}
// Call the method, it will retry 12 times with a gap of 5 seconds between tries
var html = await RetryAsync<string, HttpRequestException>(GetHtmlAsync("https://www.google.co.uk"), 12, 5);
爲什麼該方法繼續即使失敗,雖然我的連接已啓用,並在隨後的重試工作?
你不應該創建一個HttpClient這麼多的實例。這將導致長期的問題。創建一個實例並重用它。 – Nkosi
@NKosi你是基於在這裏顯示的5秒重試,還是通常是昂貴的重新創建'HttpClient'?我應該指出,這個重試只是爲了排除故障,實際上我可能會在嘗試之間等待至少30秒。 – Equalsk
https://stackoverflow.com/questions/24043679/how-many-httpclients-should-i-create – Nkosi