Un peu d'informations générales.
J'apprends la pile API Web et j'essaie d'encapsuler toutes les données sous la forme d'un objet "Result" avec des paramètres tels que Success et ErrorCodes.
Cependant, différentes méthodes produiraient des résultats et des codes d'erreur différents, mais l'objet de résultat serait généralement instancié de la même manière.
Pour gagner du temps et aussi pour en savoir plus sur les capacités async / await en C #, j'essaie d'envelopper tous les corps de méthode de mes actions d'API Web dans un délégué d'action asynchrone mais j'ai été pris dans un petit accroc ...
Compte tenu des classes suivantes:
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;
}
}
}
Je souhaite écrire une méthode qui effectue une action sur un objet Result et la renvoie. Normalement, par des méthodes synchrones, ce serait
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Mais comment puis-je transformer cette méthode en une méthode asynchrone en utilisant async / await?
Voici ce que j'ai essayé:
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()
dans une méthode, cette méthode devrait elle-même être asynchrone et renvoyer un Task<T>
where T
est ce que vous auriez retourné si la méthode était synchrone. L'idée est que de cette façon, chaque appelant de votre méthode peut alors "attendre de façon asynchrone" (je ne sais pas quel bon terme pour cela) que le sous-jacent Stream.ReadAsync()
se termine. Une métaphore pour cela que vous pouvez utiliser est qu'async est "infectieux", et se propage des E / S intégrées de bas niveau vers d'autres codes dont les résultats dépendent de ceux desdites E / S.
new
leT
, pourquoi votre méthode doit-elle être asynchrone? AFAIK dans le code utilisant des API asynchrones, il vous suffit de propager leasync
ness à partir d'autres méthodes que vous utilisez.