Немного справочной информации.
Я изучаю стек веб-API и пытаюсь инкапсулировать все данные в виде объекта «Результат» с такими параметрами, как Success и ErrorCodes.
Однако разные методы дадут разные результаты и коды ошибок, но объект результата обычно создается одинаково.
Чтобы сэкономить время, а также узнать больше о возможностях async / await в C #, я пытаюсь обернуть все тела методов своих действий веб-api в делегат асинхронного действия, но попал в небольшую загвоздку ...
Учитывая следующие классы:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Я хочу написать метод, который выполняет действие над объектом Result и возвращает его. Обычно с помощью синхронных методов это было бы
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Но как мне преобразовать этот метод в асинхронный с помощью async / await?
Вот что я пробовал:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
в методе, этот метод сам должен быть асинхронным и возвращать Task<T>
where T
- это то, что вы бы вернули, если бы метод был синхронным. Идея состоит в том, что таким образом каждый вызывающий ваш метод может затем «асинхронно ждать» (я не знаю, какой для этого хороший термин) завершения базового метода Stream.ReadAsync()
. Метафора для этого, которую вы можете использовать, заключается в том, что асинхронный режим «заразителен» и распространяется от низкоуровневого встроенного ввода-вывода в другой код, результаты которого зависят от результатов указанного ввода-вывода.
new
поднимаетесьT
, почему ваш метод должен быть асинхронным? AFAIK в коде с использованием асинхронных API-интерфейсов, вам нужно только распространить информациюasync
из других методов, которые вы используете.