web-dev-qa-db-fra.com

attendre Task.CompletedTask pour quoi?

J'ai créé l'application UWP avec Windows Template Studio qui a été présentée à Build2017.

La classe ci-dessous fait partie du code généré.

public class SampleModelService
{
    public async Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        await Task.CompletedTask; // <-- what is this for?
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });
        return data;
    }
}

Ma question est, quel est le but et la raison de await Task.CompletedTask; code ici? Il n'a en fait pas de récepteur de résultat Task.

17
Youngjae

Probablement juste là pour faciliter l'implémentation ultérieure des appels de code asynchrone sans avoir à modifier la signature, ce qui évite d'avoir à refactoriser le code appelant.

Une autre option serait de supprimer le mot clé async de la signature de la méthode et de cette ligne et de faire

return Task.FromResult<IEnumerable<SampleModel>>(data); 

Vous voyez cette construction lorsque vous devez renvoyer une tâche attendue en raison d'une interface par exemple alors que l'implémentation n'a aucun travail asynchrone à faire.

Dans ce cas, cependant, comme il s'agit d'un modèle, ils s'attendent à ce que les gens remplacent le await Task.Completed Par quelque chose comme await FetchDataFromDatabaseAsync();. Étant donné que le mot clé async est déjà là, il minimise les modifications nécessaires pour implémenter votre propre appel asynchrone.

Quoi qu'il en soit, sans cette construction en attente, vous pouvez le faire:

public class SampleModelService
{
    public Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });

        return Task.FromResult<IEnumerable<SampleModel>>(data); 
     }
}

S'il n'y a aucune obligation de retourner une tâche (vous n'avez pas de code asynchrone), supprimez-la complètement. (Mais alors vous devez refactoriser le code qui appelle cette méthode)

En examinant ce code, je soupçonne que quelqu'un va appeler une méthode asynchrone plus tard dans le processus de développement et je l'avais déjà prévu en spécifiant que cette méthode renvoie un Task.

29
Peter Bons