IAsyncEnumerable<T> eşzamansız varyantıdır. .NET Core 3.0'da tanıtıldı IEnumerable<T>. Eşzamansız akışları etkinleştirin: Eşzamansız olarak iletilen veriler üzerinde kademeli, engellemesiz yineleme.
Duyurudan sonra devamını okuyun
Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla çok sayıda orta ve büyük ölçekli şirketi danışmanlık, eğitim ve yazılım geliştirme yoluyla destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.
LINQ işlemleri IAsyncEnumerable<T> önceden System.Linq.Async NuGet paketi gerekliydi. Artık bu işlevsellik .NET'in kalbinde mevcuttur.
(Resim: King/stock.adobe.com)
Bu, .NET 11.0'daki bir yeniliktir: Dr. Holger Schwichtenberg ve diğer uzmanlar, 17 Kasım 2026'da BetterCode() .NET 11.0 çevrimiçi konferansında .NET SDK, C# 15.0 ve daha fazlasındaki geliştiriciler için değişiklikleri sunacaklar. Program yayına girene kadar indirimli kör kuş biletleri mevcuttur.
Aşağıdaki kod kullanır Where() VE OrderBy() ile IAsyncEnumerable<T>:
namespace NET10_Console.FCL;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
public readonly record struct Kabinettsmitglied(string Name, string Amt);
/// <summary>
/// LINQ auf IAsyncEnumerable<T> erforderte bisher NuGet-Paket System.Linq.Async
/// </summary>
public class FCL10_LINQAsyncEnumerable
{
public async Task Run()
{
CUI.Demo(nameof(FCL10_LINQAsyncEnumerable));
// Hole Personen im Bundeskabinett
var datenquelle = new Bundeskabinett().GetAll();
// Asynchrone Iteration mit LINQ (Filtern und optional Sortieren)
// Achtung: .OrderBy(x=>x.Name) führt dazu, dass foreach auf das letzte Element warten muss --> Vorteil von async entfällt :-(
await foreach (var person in datenquelle.Where(x => x.Amt.Contains("ministerin")))
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + ": " + person);
}
}
public class Bundeskabinett
{
/// <summary>
/// Liefert alle Mitglieder des Bundeskabinetts (Stand: 21.09.2025) als Async-Stream.
/// Quelle: Bundesregierung.de (siehe Code-Kommentar).
/// </summary>
public async IAsyncEnumerable<Kabinettsmitglied> GetAll(
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
// Quelle: https://www.bundesregierung.de/breg-de/bundesregierung/bundeskabinett
var daten = new List<Kabinettsmitglied>
{
new("Friedrich Merz", "Bundeskanzler"),
new("Lars Klingbeil", "Bundesminister der Finanzen"),
new("Alexander Dobrindt", "Bundesminister des Innern"),
new("Dr. Johann Wadephul", "Bundesminister des Auswärtigen"),
new("Boris Pistorius", "Bundesminister der Verteidigung"),
new("Katherina Reiche", "Bundesministerin für Wirtschaft und Energie"),
new("Dorothee Bär", "Bundesministerin für Forschung, Technologie und Raumfahrt"),
new("Dr. Stefanie Hubig", "Bundesministerin der Justiz und für Verbraucherschutz"),
new("Karin Prien", "Bundesministerin für Bildung, Familie, Senioren, Frauen und Jugend"),
new("Bärbel Bas", "Bundesministerin für Arbeit und Soziales"),
new("Dr. Karsten Wildberger", "Bundesminister für Digitales und Staatsmodernisierung"),
new("Patrick Schnieder", "Bundesminister für Verkehr"),
new("Carsten Schneider", "Bundesminister für Umwelt, Klimaschutz, Naturschutz und nukleare Sicherheit"),
new("Nina Warken", "Bundesministerin für Gesundheit"),
new("Alois Rainer", "Bundesminister für Landwirtschaft, Ernährung und Heimat"),
new("Reem Alabali Radovan", "Bundesministerin für wirtschaftliche Zusammenarbeit und Entwicklung"),
new("Verena Hubertz", "Bundesministerin für Wohnen, Stadtentwicklung und Bauwesen"),
new("Thorsten Frei", "Bundesminister für besondere Aufgaben / Chef des Bundeskanzleramtes"),
};
foreach (var m in daten)
{
cancellationToken.ThrowIfCancellationRequested();
yield return m;
await Task.Delay(200); // Simuliere etwas Wartezeit
await Task.Yield(); // sorgt für echte Asynchronität beim Streamen
}
}
}
}

Ekran görüntüsü, veriler geldikten hemen sonra, farklı zamanlarda sıralama yapmadan çıktıyı göstermektedir (Şekil 1).

Ekran görüntüsü çıktının farklı zamanlarda sıralandığını gösteriyor: ilk çıktıdan önce bir bekleme süresi vardı (Şekil 2).
Pratik bir örnek: Aşağıdaki kod, sonuçların eşzamansız çıktısı ile bir dizi HTTP çağrısının yürütülmesini gösterir. Task.WhenEach(). Şimdi burada bir filtre var Where() veya bir sipariş OrderBy() olası. Ancak her zamanki gibi bu, en son sonuç elde edilene kadar daha fazla işlemin yapılmasını engeller, böylece eşzamansız yürütmenin faydası azalır.
Duyurudan sonra devamını okuyun
public async Task Run()
{
CUI.Demo(nameof(FCL10_LINQAsyncEnumerable));
Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: Starte Websiteabfragen...");
using HttpClient http = new();
Task<HttpResponseMessage> t1 = http.GetAsync("https://www.CNN.com");
Task<HttpResponseMessage> t2 = http.GetAsync("https://microsoft.com");
Task<HttpResponseMessage> t3 = http.GetAsync("https://www.dotnetframework.de");
Task<HttpResponseMessage> t4 = http.GetAsync("https://www.dotnet-lexikon.de");
Task<HttpResponseMessage> t5 = http.GetAsync("https://www.dotnet9.de");
Task<HttpResponseMessage> t6 = http.GetAsync("https://www.dotnet10.de");
Task<HttpResponseMessage> t7 = http.GetAsync("https://www.web.de");
// Liste aus Tasks
List<Task<HttpResponseMessage>> taskList = new() { t1, t2, t3, t4, t5, t6, t7 };
// WhenEach() gibt es seit .NET 9.0
IAsyncEnumerable<Task<HttpResponseMessage>> taskList2 = Task.WhenEach(taskList);
// NEU in .NET 10.0: LINQ auf IAsyncEnumerable<T>
taskList2 = taskList2.Where(x => x.Result.RequestMessage.RequestUri.ToString().Contains("dot"));
taskList2 = taskList2.OrderBy(x => x.Result.RequestMessage.RequestUri.Host);
await foreach (Task<HttpResponseMessage> t in taskList2)
{
try
{
Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: {t.Status} {t.Result?.RequestMessage?.RequestUri} = {t?.Result?.StatusCode}"); // Status des HTTP-Aufrufs
}
catch (Exception ex)
{
CUI.Warning(ex);
}
}
}
(Ben)

Bir yanıt yazın