Вторая реализация асинхронной задачи без ожидания - PullRequest
0 голосов
/ 28 октября 2019

Что я могу сделать, если у меня есть интерфейс, который возвращает задачу (void), но у одной из реализаций нет асинхронного действия?

Мой интерфейс IDatabaseService имеет две реализации: FirestoreDatabaseService и CacheDatabaseService . FirestoreDatabaseService имеет смысл использовать метод асинхронная задача AddResult (ResultDto result) как результат метода, но CacheDatabaseService имеет только список и не нуждается в ожидании, в основном это метод void.

Я получаю предупреждение "Предупреждение CS1998 В этом асинхронном методе отсутствуют операторы" await "и он будет работать синхронно. Рассмотрите возможность использования"оператор «ожидание» для ожидания неблокирующих вызовов API или «ожидание Task.Run (...)» », когда я реализую метод в асинхронном CacheDatabaseService. Если я удалю асинхронный вызов, мне придется вернуть задачу, но Task.FromResult не будет работать для пустых задач.

1 Ответ

4 голосов
/ 28 октября 2019

Это предупреждение почти всегда означает, что ваш метод не должен быть async.

Ключевое слово async действительно просто позволяет использовать await. Поэтому, если вы не используете await, вам не нужно async.

Если AddResult должен вернуть Task, а затем вернуть Task. Если вы на самом деле ничего не делаете асинхронно, вы можете вернуть Task.CompletedTask.

Например:

public Task AddResult(ResultDto result) {
    ...
    return Task.CompletedTask;
}

Если вам нужно вернуть значение (Task<T>), тогда вы можете использовать Task.FromResult().

Интерфейс, который указывает, что метод должен возвращать Task - это просто способ сделать его возможным чтобы сделать метод async. Это не значит, что должно.

...