C# (.NET) में रिएक्टिव प्रोग्रामिंग: Observable, Rx.NET और डेटा स्ट्रीम के साथ कार्य
रिएक्टिव प्रोग्रामिंग (Reactive Programming) एक प्रतिमान है जो डेटा स्ट्रीम के एसिंक्रोनस प्रसंस्करण और परिवर्तनों के प्रसार पर केंद्रित है। C# (.NET) इकोसिस्टम में, इस अवधारणा को Rx.NET (Reactive Extensions) लाइब्रेरी और IObservable<T> / IObserver<T> इंटरफेस के माध्यम से कार्यान्वित किया गया है। शास्त्रीय अनिवार्य दृष्टिकोण के विपरीत, रिएक्टिव प्रोग्रामिंग आपको यह घोषणात्मक रूप से वर्णन करने की अनुमति देता है कि सिस्टम को मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना घटनाओं पर कैसे प्रतिक्रिया देनी चाहिए।
PythonLib पेज पर, हम C# में रिएक्टिव प्रोग्रामिंग के प्रमुख घटकों की जांच करेंगे, जिसमें Observable अनुक्रम, स्ट्रीम ट्रांसफॉर्मेशन के लिए LINQ ऑपरेटर और व्यावहारिक उपयोग उदाहरण शामिल हैं।
C# में रिएक्टिव प्रोग्रामिंग की मूल अवधारणाएँ
रिएक्टिव प्रोग्रामिंग Observer पैटर्न पर आधारित है, जहाँ:
- Observable — डेटा का स्रोत (घटनाओं की स्ट्रीम)।
- Observer — सब्सक्राइबर, जो आने वाले डेटा पर प्रतिक्रिया करता है।
- Subscription — सब्सक्रिप्शन प्रबंधित करने का तंत्र (स्ट्रीम से सब्सक्रिप्शन रद्द करना)।
.NET में, ये अवधारणाएँ IObservable<T> और IObserver<T> इंटरफेस द्वारा दर्शायी जाती हैं, लेकिन व्यवहार में Rx.NET लाइब्रेरी (NuGet पैकेज System.Reactive) का अधिक उपयोग किया जाता है, जो अनुक्रमों के साथ काम करने के लिए ऑपरेटरों का एक समृद्ध सेट प्रदान करती है।
Rx.NET की स्थापना
आरंभ करने के लिए, प्रोजेक्ट में NuGet पैकेज जोड़ें:
Install-Package System.Reactiveया .NET CLI के माध्यम से:
dotnet add package System.ReactiveObservable बनाना और डेटा स्ट्रीम की सदस्यता लेना
सबसे सरल उदाहरण पर विचार करें: एक Observable बनाएँ जो विलंब के साथ 1 से 5 तक संख्याएँ उत्पन्न करता है, और उसकी सदस्यता लें।
using System;using System.Reactive.Linq;using System.Threading.Tasks;
class Program{ static async Task Main() { // Observable अनुक्रम बनाएँ var observable = Observable.Interval(TimeSpan.FromSeconds(1)) .Select(x => x + 1) // 1 से शुरू करें .Take(5); // केवल 5 तत्व लें
// स्ट्रीम की सदस्यता लें var subscription = observable.Subscribe( onNext: value => Console.WriteLine($"प्राप्त: {value}"), onError: error => Console.WriteLine($"त्रुटि: {error.Message}"), onCompleted: () => Console.WriteLine("स्ट्रीम समाप्त") );
// समाप्ति की प्रतीक्षा करें (वास्तविक कोड में await या ब्लॉकिंग का उपयोग करें) await Task.Delay(6000);
// सब्सक्रिप्शन रद्द करें (संसाधन मुक्त करें) subscription.Dispose(); }}स्ट्रीम ट्रांसफॉर्मेशन के लिए LINQ ऑपरेटर
Rx.NET का एक मुख्य लाभ डेटा स्ट्रीम पर LINQ से परिचित ऑपरेटरों को लागू करने की क्षमता है: Where, Select, Aggregate और अन्य। यह परिवर्तनों को घोषणात्मक रूप से वर्णित करने की अनुमति देता है।
उदाहरण: फ़िल्टरिंग और ट्रांसफ़ॉर्मेशन
using System;using System.Reactive.Linq;
var numbers = Observable.Range(1, 10);
var processed = numbers .Where(n => n % 2 == 0) // केवल सम संख्याएँ .Select(n => n * n) // वर्ग करें .Do(n => Console.WriteLine($"संसाधित: {n}")); // साइड इफ़ेक्ट
processed.Subscribe( onNext: n => Console.WriteLine($"परिणाम: {n}"), onCompleted: () => Console.WriteLine("तैयार"));कई स्ट्रीम का संयोजन
Rx.NET स्ट्रीम के विलय, संयोजन और मिश्रण का समर्थन करता है। उदाहरण के लिए, Merge कई Observable को एक में जोड़ता है:
<