4 votes

J'ai besoin d'aide pour refacturer cette boucle async-await basique.

J'ai donc un objet de gestion qui prend en charge la méthode "Save", qui effectue des entrées/sorties sur un périphérique. J'ai ensuite une liste de ces objets que je veux sauvegarder de manière asynchrone dans un lot. Mon code ressemble maintenant à ceci :

    public async Task Save()
    {
        foreach (var element in Elements)
        {
            await element.Save();
        }
    }    

Il en résulte que n nombre d'attentes, et je sais que chaque attente cause un peu de surcharge CPU. Je veux éliminer cela et n'avoir qu'une seule attente. Comment puis-je remanier le système pour y parvenir ?

13voto

Jon Skeet Points 692016

Eh bien, vous pourriez appeler Save() sur tout et ensuite attendre qu'ils finissent tous en utilisant Task.WhenAll :

public async Task Save()
{
    await Task.WhenAll(Elements.Select(x => x.Save());
} 

ou si tu ne fais vraiment rien d'autre, juste.. :

public Task Save()
{
    return Task.WhenAll(Elements.Select(x => x.Save());
} 

EDIT : Si vous voulez les faire en série, utilisez le code que vous avez déjà. Il est intéressant de noter que de la manière dont async/await a été conçu, attendre un appel qui en fait se termine de manière synchrone (par exemple, un hit de cache, ou dans votre cas, un dirty checking) est vraiment bon marché. Il n'a pas besoin de planifier les tâches, de créer une continuation ou quoi que ce soit d'autre. C'est vous qui le dites :

Si j'ai une liste de 10000 objets, et qu'un seul est sale, je me retrouverai avec 9999 attentes asynchrones inutiles, ce qui, je le soupçonne, sera significatif.

Comme toujours, soupçons sur les goulots d'étranglement des performances n'ont pas beaucoup de sens - ce qui est important, c'est que preuve sur les goulots d'étranglement des performances. Avez-vous essayé le code existant et mesuré le coût ? Si ce n'est pas le cas, je vous conseille vivement de le faire avant de changer quoi que ce soit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X