我有几种需要某种形式的互联网连接的方法。如果连接失败,我希望在失败之前重试该方法一段时间。由于应用程序可以在等待成功响应时继续正常运行,因此我想以异步方式执行此操作。
我使用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
就很昂贵?我应该指出,这个重试只是为了排除故障而短暂的,实际上我可能会在尝试之间等待至少30秒。 - Equalsk