Squeak.ru - шаблоны программирования

Передача асинхронной лямбды в статический метод. Невозможно преобразовать лямбда-выражение в тип Task

Итак, я пытаюсь придумать правильную асинхронную перегрузку, которая соответствовала бы этому ответу.

Чтобы дать некоторый контекст, мне нужно выполнять асинхронные 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);
}

Ответы:


1

Похоже, action должен быть Func<Task<T>>. Обратите внимание, что вы также можете удалить проверку типа исключения.

static async Task<T> Do<T, U>(
            Func<Task<T>> action,
            TimeSpan retryInterval,
            int retryCount = 3) 
              where U : Exception
{
  var exceptions = new List<U>();

  for(int retry = 0; retry < retryCount; retry++)
  {
     try
     {
        return await action();
     }
     catch(U ex)
     {
        exceptions.Add(ex);
     }
     catch(Exception ex) { }
     await Task.Delay(retryInterval);
  }
  throw new AggregateException(exceptions);
}
02.07.2014
  • Да, удаление проверки типа исключения имеет смысл. Я попробую это 03.07.2014
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...