Я реализую интерфейс, который определяет асинхронный метод - тот, который возвращает Task<T>
объект.
public class ValidationResult
{
// Properties that will hold the results of a validation.
}
public interface IValidator
{
Task<ValidationResult> Validate(object objectToValidate);
}
В большинстве классов, реализующих этот интерфейс, в методе Validate
выполняется асинхронная работа. Таким образом, ключевые слова async
и await
используются.
public class ExampleAsyncValidator : IValidator
{
public override async Task<ValidationResult> Validate(object objectToValidate)
{
// Perform some asynchronous calls here which will use the await keyword.
return new ValidationResult { /* ... */ };
}
}
Однако некоторые классы, реализующие этот интерфейс , не выполняют асинхронную работу в методе Validate
.
public class ExampleSyncValidator : IValidator
{
public override async Task<ValidationResult> Validate(object objectToValidate)
{
// Perform only synchronous calls here. No use of the await keyword.
return new ValidationResult { /* ... */ };
}
}
Если ключевое слово async
используется для метода Validate
в синхронном сценарии выше, то я получаю предупреждение CS1998 от компилятора.
В этом асинхронном методе отсутствуют операторы ожидания и он будет работать синхронно. Подумайте об использовании оператора «await» для ожидания неблокирующих вызовов API или «await Task.Run (...)» для выполнения работы с привязкой к ЦП в фоновом потоке.
Я понимаю из одного конкретного вопроса и ответа , что я могу просто реализовать метод без включения ключевого слова async
и вернуть завершенные Task
объекты.
public class ExampleSyncValidator : IValidator
{
public override Task<ValidationResult> Validate(object objectToValidate)
{
// Perform only synchronous calls here. No use of the await keyword.
return Task.FromResult(new ValidationResult { /* ... */ });
}
}
Мой вопрос: Какова наилучшая практика обработки исключений в этом сценарии?
Если мой синхронный код выдает Исключение, должен ли я позволить ему остаться нетронутым? Или было бы лучше поймать его и обернуть в неудачный объект Task
, используя Task.FromException<ValidationResult>(ex)
?