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.

vorlesen Druckansicht 1 Kommentar lesen
Schild mit .NET

(Bild: Pincasso/Shutterstock.com)

Lesezeit: 1 Min.
Von
  • 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.

Der Dotnet-Doktor – Holger Schwichtenberg
Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

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)