C# asyn c последующие вызовы возвращают существующую задачу - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть веб-приложение, которое вызывает внешний API для данных.

Если пользователь запускает этот внешний вызов, и этот вызов уже действует, я не хочу, чтобы второй запрос инициировал новый вызов , но вместо этого дождитесь результата первого вызова (результат вызова будет одинаковым для обоих запросов).

Как я могу добиться этого в c#, используя async / await?

1 Ответ

2 голосов
/ 12 февраля 2020

последующие вызовы возвращают существующую задачу

Конечно, вы можете сделать это, просто сохранив объект Task<T>, а затем вернув его.

Что-то вроде:

private async Task<T> ImplementationAsync();
private Task<T> _task;

public Task<T> InterfaceAsync()
{
  if (_task == null)
    _task = ImplementationAsync();
  return _task;
}

Это очень простой пример. Реальный код должен учитывать:

  • Может ли InterfaceAsync вызываться из нескольких потоков? Если это так, тогда _task необходимо защитить.
  • Этот код загружает ресурс только один раз? Если это так, то рассмотрите возможность использования AsyncLazy<T> вместо Task<T>.
  • Должен ли этот код повторно загружать ресурс при следующем вызове, если старый вызов уже завершен? Если это так, то после завершения вызова необходимо заменить кэшированный Task<T> / AsyncLazy<T>.
  • Исправлены ли ошибки кэширования или следующий вызов всегда повторяет любые предыдущие ошибки?
...