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?
}
la source
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.Stream.ReadAsync()
dans une méthode, cette méthode devrait elle-même être asynchrone et renvoyer unTask<T>
whereT
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-jacentStream.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.Réponses:
L'
async
équivalent deAction<T>
estFunc<T, Task>
, donc je pense que c'est ce que vous recherchez:la source
void
méthode est uneTask
méthode -returning; ainsi, l'équivalent asynchrone deAction
estFunc<Task>
et l'équivalent asynchrone deAction<T>
estFunc<T, Task>
. Plus d'infos ici .Task
lorsqu'elle n'a pas de valeur de retour. S'il utilise leasync
mot - clé, l'Task
instance réelle sera créée par une machine à états, et non directement par la fonction.Je pense donc que la manière de mettre en œuvre ceci est:
la source
Task.Run
(et encore plusStartNew
) sur ASP.NET.