Ответ 1
Короткий ответ
- Метод
virtual
может быть помечен какasync
- Метод
abstract
не может быть помечен какasync
Причиной этого является async
, фактически не являющийся частью сигнатуры метода. Он просто сообщает компилятору, как обрабатывать компиляцию самого тела метода (и не относится к переопределяющим методам). Поскольку абстрактный метод не имеет тела метода, нет смысла применять модификатор async
.
Длинный ответ
Вместо вашей текущей подписи в базовом классе я бы рекомендовал следующее, если базовый класс предоставляет стандартную реализацию метода, но не нуждается в какой-либо работе.
protected virtual Task LoadDataAsync() {
return Task.FromResult(default(object));
}
Ключевыми изменениями в вашей реализации являются следующие:
- Измените возвращаемое значение с
void
наTask
(помните, чтоasync
на самом деле не является частью возвращаемого типа). В отличие от возвращаемогоvoid
, когда возвращаетсяTask
, вызывающий код имеет возможность выполнить одно из следующих действий:- Дождитесь завершения операции
- Проверить статус задачи (завершена, отменена, сбой)
- Избегайте использования модификатора
async
, поскольку для метода не требуетсяawait
ничего. Вместо этого просто верните уже завершенный экземплярTask
. Методы, которые переопределяют этот метод, по-прежнему смогут использовать модификаторasync
, если он ему нужен.