Немного справочной информации.
Я изучаю стек веб-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?
}
c#
asynchronous
asp.net-web-api
async-await
c#-5.0
Альбин Анке
источник
источник
new
поднимаетесьT
, почему ваш метод должен быть асинхронным? AFAIK в коде с использованием асинхронных API-интерфейсов, вам нужно только распространить информациюasync
из других методов, которые вы используете.Stream.ReadAsync()
в методе, этот метод сам должен быть асинхронным и возвращатьTask<T>
whereT
- это то, что вы бы вернули, если бы метод был синхронным. Идея состоит в том, что таким образом каждый вызывающий ваш метод может затем «асинхронно ждать» (я не знаю, какой для этого хороший термин) завершения базового методаStream.ReadAsync()
. Метафора для этого, которую вы можете использовать, заключается в том, что асинхронный режим «заразителен» и распространяется от низкоуровневого встроенного ввода-вывода в другой код, результаты которого зависят от результатов указанного ввода-вывода.Ответы:
async
ЭквивалентAction<T>
являетсяFunc<T, Task>
, таким образом , я считаю , что это то , что вы ищете:источник
void
метода -Task
метод возврата; таким образом, асинхронный эквивалентAction
isFunc<Task>
и асинхронный эквивалентAction<T>
isFunc<T, Task>
. Больше информации здесь .Task
если он не имеет возвращаемого значения. Если он используетasync
ключевое слово, то фактическийTask
экземпляр будет создан конечным автоматом, а не функцией напрямую.Итак, я считаю, что способ реализовать это:
источник
Task.Run
(и тем болееStartNew
) ASP.NET.