Neu in .NET 9.0 [24]: Erweiterung für die Task-Klasse
Die foreach-Schleife macht jeweils einen Durchlauf, wenn ein Ergebnis einer der angegebenen Aufgaben bereitsteht.
(Bild: Pincasso/Shutterstock.com)
- Dr. Holger Schwichtenberg
Die Klasse System.Threading.Tasks.Task bietet die neue Methode WhenEach(), die ein IAsyncEnumerable<Task> liefert und eine foreach-Schleife jeweils durchläuft, sobald ein Ergebnis einer der angegebenen Aufgaben bereitsteht.
Das heißt: Die Arbeit beginnt, sobald es ein erstes Ergebnis gibt und nicht erst, wenn alle Ergebnisse zur Verfügung stehen wie bei der Methode WhenAll(), die es seit dem klassischen .NET Framework 4.5 gibt.
Videos by heise
Folgender Code verwendet WhenEach(), um den Status von mehreren HTTP-Anfragen sukzessive zu ermitteln:
public async Task Run()
{
CUI.Demo(nameof(FCL9_Task)+ " WhenEach()");
using HttpClient http = new();
Task<HttpResponseMessage> t1 = http.GetAsync("http://CNN.com");
Task<HttpResponseMessage> t2 = http.GetAsync("http://microsoft.com");
Task<HttpResponseMessage> t3 = http.GetAsync("http://www.dotnetframework.de");
Task<HttpResponseMessage> t4 = http.GetAsync("http://www.dotnet-lexikon.de");
Task<HttpResponseMessage> t5 = http.GetAsync("http://www.dotnet9.de");
// Starte einen Task, der 5 Sekunden braucht und HttpResponseMessage zurückgibt
Task<HttpResponseMessage> t6 = Task.Delay(5000).ContinueWith(t => new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError) { RequestMessage = new HttpRequestMessage() { RequestUri = new Uri("http://unsinn") } });
await foreach (Task<HttpResponseMessage> t in Task.WhenEach(t1, t2, t3, t4, t5, t6))
{
Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: {t.Result?.RequestMessage?.RequestUri} = {t?.Result?.StatusCode}");
}
}
(rme)