C# Language Retourner une tâche sans attendre


Exemple

Les méthodes qui effectuent des opérations asynchrones ne ont pas besoin d'utiliser await si:

  • Il n'y a qu'un seul appel asynchrone dans la méthode
  • L'appel asynchrone est à la fin de la méthode
  • Une exception de capture / traitement pouvant survenir dans la tâche n'est pas nécessaire

Considérez cette méthode qui renvoie une Task :

public async Task<User> GetUserAsync(int id)
{
    var lookupKey = "Users" + id;

    return await dataStore.GetByKeyAsync(lookupKey);
}

Si GetByKeyAsync a la même signature que GetUserAsync (en retournant une Task<User> ), la méthode peut être simplifiée:

public Task<User> GetUserAsync(int id)
{
    var lookupKey = "Users" + id;

    return dataStore.GetByKeyAsync(lookupKey);
}

Dans ce cas, la méthode n'a pas besoin d'être marquée async , même si elle effectue une opération asynchrone. Le Groupe retourné par GetByKeyAsync est transmis directement à la méthode d'appel, où il sera await ed.

Important : Le fait de renvoyer la Task au lieu de l'attendre modifie le comportement d'exception de la méthode, car elle ne déclenche pas l'exception dans la méthode qui lance la tâche mais dans la méthode qui l'attend.

public Task SaveAsync()
{
    try {
        return dataStore.SaveChangesAsync();
    }
    catch(Exception ex)
    {
        // this will never be called
        logger.LogException(ex);
    }
}

// Some other code calling SaveAsync()

// If exception happens, it will be thrown here, not inside SaveAsync()
await SaveAsync();

Cela améliorera les performances car cela permettra au compilateur d'économiser la génération d'une machine à états asynchrone supplémentaire.