C# (.NET) में कार्य कतारें: System.Threading.Channels और TPL Dataflow

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# (.NET) के लिए कार्य कतारें: System.Threading.Channels और TPL Dataflow

C# (.NET) में मल्टीथ्रेडेड एप्लिकेशन विकसित करते समय, उत्पादकों (producers) और उपभोक्ताओं (consumers) के बीच एसिंक्रोनस डेटा ट्रांसफर को व्यवस्थित करने की आवश्यकता अक्सर उत्पन्न होती है। क्लासिक Producer-Consumer पैटर्न कार्य कतारों की मदद से हल किया जाता है। .NET इकोसिस्टम में इसके लिए दो शक्तिशाली उपकरण हैं: System.Threading.Channels (.NET Core 3.0 में आया) और TPL Dataflow लाइब्रेरी (.NET 4.5 से भाग)।

इस लेख में, हम दोनों दृष्टिकोणों, उनकी विशेषताओं पर चर्चा करेंगे और व्यावहारिक कोड उदाहरण प्रस्तुत करेंगे।



1. System.Threading.Channels — हल्की और तेज़ कतार

नेमस्पेस System.Threading.Channels थ्रेड-सेफ, एसिंक्रोनस कतारें प्रदान करता है जो उच्च थ्रूपुट परिदृश्यों के लिए अनुकूलित हैं। मुख्य प्रकार:

  • Channel<T> — चैनल का एब्सट्रैक्ट क्लास।
  • Channel.CreateUnbounded<T>() — असीमित कतार (मेमोरी ओवरफ्लो का जोखिम)।
  • Channel.CreateBounded<T>(int capacity) — दबाव नियंत्रण के साथ सीमित कतार।
  • ChannelWriter<T> — लिखने के लिए इंटरफ़ेस।
  • ChannelReader<T> — पढ़ने के लिए इंटरफ़ेस।


उदाहरण: Channel के साथ Producer-Consumer

एक सरल उदाहरण बनाते हैं जहाँ एक उत्पादक संख्याएँ उत्पन्न करता है और एक उपभोक्ता उन्हें संसाधित करता है।

using System.Threading.Channels;using System.Threading.Tasks;

var channel = Channel.CreateUnbounded<int>();

// Producervar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync(i); Console.WriteLine($"उत्पादित: {i}"); await Task.Delay(100); } channel.Writer.Complete(); // समाप्ति का संकेत});

// Consumervar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"संसाधित: {item * 2}"); await Task.Delay(200); }});

await Task.WhenAll(producer, consumer);Console.WriteLine("तैयार!");

Channels के लाभ:

  • न्यूनतम ओवरहेड (अतिरिक्त ऑब्जेक्ट आवंटन के बिना)।
  • async/await और IAsyncEnumerable के लिए अंतर्निहित समर्थन।
  • उच्च-लोड सिस्टम (जैसे नेटवर्क पैकेट प्रसंस्करण) के लिए आदर्श।


2. TPL Dataflow — शक्तिशाली प्रसंस्करण पाइपलाइन

लाइब्रेरी System.Threading.Tasks.Dataflow पाइपलाइन (pipeline) और डेटा प्रसंस्करण नेटवर्क बनाने के लिए अधिक जटिल ब्लॉक प्रदान करती है। मुख्य ब्लॉक:

  • BufferBlock<T> — सरल कतार।
  • ActionBlock<T> — प्रत्येक आइटम पर कार्रवाई करने वाला ब्लॉक।
  • TransformBlock<TInput, TOutput> — प्रत्येक आइटम को रूपांतरित करता है।
  • BatchBlock<T> — आइटम को बैच में समूहित करता है।


उदाहरण: ActionBlock के साथ पाइपलाइन

उसी कार्य को लागू करें: उत्पादक संख्याएँ भेजता है, उपभोक्ता संसाधित करता है।

using System.Threading.Tasks.Dataflow;

var actionBlock = new ActionBlock<int>(async item =>{ await Task.Delay(200); Console.WriteLine($"संसाधित: {item * 2}");}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });

// Producerfor (int i = 0; i < 10; i++){ await actionBlock.SendAsync(i); Console.WriteLine($"उत्पादित: {i}"); await Task.Delay(100);}

actionBlock.Complete();await actionBlock.Completion;Console.WriteLine("तैयार!");

TPL Dataflow के लाभ:

  • लचीला सेटअप

अनुशंसाएँ