Ich muss ein vorhandenes Programm ändern und es enthält folgenden Code:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Aber das scheint mir sehr seltsam, vor allem die Verwendung von async
und await
in der Auswahl. Nach dieser Antwort von Stephen Cleary sollte ich diese fallen lassen können.
Dann die zweite, Select
die das Ergebnis auswählt. Bedeutet dies nicht, dass die Aufgabe überhaupt nicht asynchron ist und synchron ausgeführt wird (so viel Aufwand für nichts), oder wird die Aufgabe asynchron ausgeführt und wenn sie erledigt ist, wird der Rest der Abfrage ausgeführt?
Soll ich den obigen Code wie folgt schreiben, gemäß einer anderen Antwort von Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
und ist es ganz so?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Während ich an diesem Projekt arbeite, möchte ich das erste Codebeispiel ändern, aber ich bin nicht besonders daran interessiert, asynchronen Code zu ändern (anscheinend zu funktionieren). Vielleicht mache ich mir nur um nichts Sorgen und alle 3 Codebeispiele machen genau das Gleiche?
ProcessEventsAsync sieht folgendermaßen aus:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
mit InputResult
einer benutzerdefinierten Klasse.
Select
die Ergebnisse der Aufgaben vor Ihrem vergessen Where
.
Result
Eigentum der Aufgabe zuzugreifen