J'ai besoin de modifier un programme existant et il contient le code suivant:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Mais cela me semble très étrange, tout d'abord l'utilisation de async
et await
dans le select. D'après cette réponse de Stephen Cleary, je devrais pouvoir les supprimer.
Puis le second Select
qui sélectionne le résultat. Cela ne signifie-t-il pas que la tâche n'est pas du tout asynchrone et est exécutée de manière synchrone (tant d'efforts pour rien), ou la tâche sera-t-elle exécutée de manière asynchrone et lorsqu'elle est terminée, le reste de la requête est exécuté?
Dois-je écrire le code ci-dessus comme suit selon une autre réponse de Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
et est-ce complètement pareil?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Pendant que je travaille sur ce projet, j'aimerais changer le premier exemple de code, mais je ne suis pas trop désireux de changer (apparemment en train de travailler) le code async. Peut-être que je ne m'inquiète pour rien et que les 3 exemples de code font exactement la même chose?
ProcessEventsAsync ressemble à ceci:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
avec InputResult
être une classe personnalisée.
Select
les résultats des tâches avant votre Where
.
Result
propriété de la tâche