System.Threading.Channels altında bulunan ve .Net Core 3.0 itibariyle hayatımıza girmiş olan bir özelliktir. Özellikle çoklu thread ortamlarında verinin thread ‘ler arası güvenli bir şekilde iletilmesini ve işlenmesi sağlar. Gerektiğinde ideal bir çözüm olarak tercih edebilirsiniz.
Channels API Özellikleri
- İki Ana Kanal Türü:
- UnboundedChannel: Kapasitesi sınırsız olan bir kanaldır. Herhangi bir veri miktarını kabul eder.
- BoundedChannel: Belirli bir kapasiteye sahip olan bir kanaldır. Maksimum kapasiteye ulaştığında Producer’lar bekletilir.
- Asenkron İletişim: Channels API, async/await desenini destekler.
- Backpressure Desteği: BoundedChannel kullanarak, Consumer yetişemediğinde Producer ‘ın durdurulmasını sağlar. Bu, sistemin aşırı yüklenmesini engeller.
- Thread-Safe: Channels, çoklu thread ortamında güvenli bir şekilde çalışacak şekilde tasarlanmıştır. Bu sayede birden fazla Producer ve Consumer aynı kanalı kullanabilir.
Kullanıma Örnek
- Producer-Consumer Deseni: Örneğin, bir veri işleme hattında bir thread veri üretirken, başka bir thread bu veriyi işleyebilir.
Örnek Kod
Aşağıda basit bir UnboundedChannel örneği bulunmaktadır, yeni bir Console App oluşturarak uygulamayı test edebilirsiniz.
var userDataChannel = Channel.CreateUnbounded<UserModel>();
// Producer Task
var producer = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await userDataChannel.Writer.WriteAsync(new UserModel() { Id = i, Name = "User_" + i });
Console.WriteLine($"=========================");
Console.WriteLine($"Produced: User_{i}");
}
userDataChannel.Writer.Complete();
});
// Consumer Task
var consumer = Task.Run(async () =>
{
await foreach (var userModel in userDataChannel.Reader.ReadAllAsync())
{
Console.WriteLine($"=========================");
Console.WriteLine($"Consumed: {userModel.Id}");
Console.WriteLine($"Consumed: {userModel.Name}");
}
});
Task.WhenAll(producer, consumer);
Çıktı:
Bu örnekte, UserModel alan bir channels oluşturduk ve produce ettik. Consumer tarafında da eş zamanlı olarak veriyi tükettik ve ekrana bastık. Buradaki kullanımları projenize göre şekillendirebilir, Producer ve Consumer kısımlarını ayrı ayrı class lara taşıyıp daha kullanılabilir bir yapı kurgulayabilirsiniz.
Faydalandığım linkler:
https://learn.microsoft.com/en-us/dotnet/core/extensions/channels
https://code-maze.com/dotnet-producer-consumer-channels/
Yeni bir yazıda görüşmek üzere 🙂