Трохи довідкової інформації.
Я вивчаю стек Web API і намагаюся інкапсулювати всі дані у вигляді об’єкта "Результат" з такими параметрами, як Success та ErrorCodes.
Однак різні методи давали б різні результати та коди помилок, але, як правило, об'єкт результатів, як правило, був би створений однаково.
Щоб заощадити деякий час, а також дізнатися більше про можливості асинхронізування / очікування в 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 / wait?
Це те, що я спробував:
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>
де T
те, що ви повернули б, був метод синхронним. Ідея полягає в тому, що таким чином кожен абонент вашого методу може потім "асинхронно зачекати" (я не знаю, що для цього хороший термін) для того, Stream.ReadAsync()
щоб завершити основу . Метафорою для цього, яку ви можете скористатися, є те, що асинхроніка є "інфекційною" і поширюється від вбудованого вводу / виводу низького рівня в інший код, результати якого залежать від результатів зазначеного вводу / виводу.
new
-ний вгору поT
, чому вашій методу потрібно бути асинхронним? AFAIK у коді з використанням асинхронних API, вам потрібно лише розповсюджуватиasync
ness з інших методів, які ви використовуєте.