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)