* Виртуальному * методу не хватает возвращаемого значения 'await'? - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть асинхронный виртуальный метод, который возвращает логическое значение по умолчанию, которое используется в некоторых базовых функциях моего приложения.то есть, если нет никакой настройки, предположите, что она прошла успешно.

Я понимаю метод предупреждения в контексте не виртуального метода, но мне интересно, как лучше реализовать это в виртуальном методе.Что я должен возвращать в виртуальном методе, чтобы убедиться, что это предупреждение удалено?Или мне просто проигнорировать?

// WARNING: This async method lacks 'await'
// virtual is the differentiating factor here
protected virtual async Task<bool> SetupAsync()
{
    return true;
}

1 Ответ

7 голосов
/ 20 сентября 2019

Я понимаю, что вы создаете класс, который вы ожидаете переопределить, и вы хотите предоставить реализацию по умолчанию для SetupAsync(), которая позволяет переопределенной версии быть async.

asyncКлючевое слово не является частью сигнатуры метода, которая должна быть скопирована для переопределения метода.Только возвращаемый тип, параметры и модификатор доступа.

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

В вашей реализации по умолчанию (которая работает синхронно), вы просто возвращаете значениев Task с использованием Task.FromResult.

Например:

class Test {
    protected virtual Task<bool> SetupAsync() {
        return Task.FromResult(true);
    }
}

class Test2 : Test {
    protected override async Task<bool> SetupAsync() {
        await Task.Delay(1000);
        return false;
    }
}

Переопределение метода - это не внутренняя работа метода, акак это подвергается другому коду.Любой код должен иметь возможность вызывать переопределенный метод так же, как это было бы с реализацией по умолчанию, и само ключевое слово async не имеет к этому никакого отношения.

Ключевое слово async простопозволяет использовать await внутри метода .Это правда, что использование ключевого слова async требует, чтобы метод возвращал Task, но тот факт, что возвращает Task, изменяет то, как другой код взаимодействует с ним.

...