Немного справочной информации.
Я изучаю стек веб-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из других методов, которые вы используете.