web-dev-qa-db-fra.com

Comment implémentez-vous une méthode de délégation d'action asynchrone?

Un peu d'informations de base.

J'apprends la pile d'API Web et j'essaie d'encapsuler toutes les données sous la forme d'un objet "Résultat" 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 un peu de temps et en savoir plus sur les fonctionnalités asynchrones/wait en C #, j'essaie d'envelopper tous les corps de méthodes de mes actions de l'API Web dans un délégué d'action asynchrone, mais je me suis retrouvé pris au piège ...

Étant donné les 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 veux écrire une méthode qui effectue une action sur un objet Result et le renvoyer. Normalement, par des méthodes synchrones, il serait

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}

Mais comment transformer cette méthode en une méthode asynchrone utilisant async/wait?

C'est 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?
}
109
Albin Anke

L'équivalent async de Action<T> est Func<T, Task>, alors je crois que c'est ce que vous cherchez:

public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
    where T : Result, new()
{
  T result = new T();
  await resultBody(result);
  return result;
}
247
Stephen Cleary