Итак, я пытаюсь придумать правильную асинхронную перегрузку, которая соответствовала бы этому ответу.
Чтобы дать некоторый контекст, мне нужно выполнять асинхронные HTTP-вызовы в разные места, чтобы проверить, выполняется ли поиск, а затем для загрузки файлов. Эта система часто возвращает различные ошибки HTTP.
Как уже много раз писалось, когда HttpClient выдает ошибку внутри асинхронного метода, он генерирует TaskCanceledException, отменяет задачу и прерывает любое последующее ожидание (например, мой await Task.WhenAll, который появится позже).
Итак, вот что у меня есть на данный момент. Я застрял на этом этапе. Компилятор сообщает мне: «Невозможно преобразовать лямбда-выражение в тип 'System.Threading.Task.Task', потому что это не тип делегата»
Я просмотрел массу вопросов SO и прочитал кучу статей на MSDN о делегатах и async / await и Task, Task ‹T>, Func ‹T>, Action и т. Д. И не могу понять, как я предполагается написать эту строку:
var DownloadResponse = Retry.Do<HttpResponseMessage,TaskCanceledException>
(async ()=> await Client.GetAsync(URL,
HttpCompletionOption.ResponseHeadersRead),TimeSpan.FromSeconds(2),3);
Вот написанная / измененная мной асинхронная перегрузка, которая называется
static async Task<T> Do<T, U>(
Task<T> action,
TimeSpan retryInterval,
int retryCount = 3)
where T : Task
where U : Exception
{
var exceptions = new List<U>();
for(int retry = 0; retry < retryCount; retry++)
{
try
{
return await action;
}
catch(Exception ex)
{
if(ex is U)
exceptions.Add(ex as U);
}
await Task.Delay(retryInterval);
}
throw new AggregateException(exceptions);
}