C# (.NET) के लिए कार्य कतारें: बुनियादी प्रिमिटिव से लेकर औद्योगिक समाधान तक
\n\nC# में उच्च-लोड अनुप्रयोगों को विकसित करते समय अतुल्यकालिक कार्य प्रसंस्करण का आयोजन एक प्रमुख कार्य है। .NET पारिस्थितिकी तंत्र में कई दृष्टिकोण हैं: अंतर्निहित सिंक्रनाइज़ेशन प्रिमिटिव से लेकर शक्तिशाली बाहरी पुस्तकालयों तक। इस लेख में, हम कार्य कतारों के साथ काम करने के लिए मुख्य उपकरणों, उनकी ताकत और उपयोग के उदाहरणों पर विचार करेंगे।
\n\n1. System.Threading.Channels — .NET का अंतर्निहित उपकरण
\n\n.NET Core 2.1 से शुरू करके, मानक पुस्तकालय में System.Threading.Channels.Channel<T> वर्ग जोड़ा गया है। यह एक थ्रेड-सुरक्षित कतार है, जो producer-consumer (उत्पादक-उपभोक्ता) परिदृश्यों के लिए अनुकूलित है।
मुख्य क्षमताएँ:
\n- \n
- अतुल्यकालिक पढ़ना और लिखना (
WriteAsync,ReadAsync) \n - सीमित और असीमित कतारों के लिए समर्थन \n
- उपभोक्ताओं को संकेत देने के लिए कतार को पूरा करने की क्षमता \n
- बिना लॉक के उच्च प्रदर्शन \n
उपयोग का उदाहरण:
\nusing System.Threading.Channels;\n\nvar channel = Channel.CreateBounded<string>(100);\n\n// उत्पादक\nvar producer = Task.Run(async () =>\n{\n for (int i = 0; i < 10; i++)\n {\n await channel.Writer.WriteAsync($"Task {i}");\n await Task.Delay(100);\n }\n channel.Writer.Complete();\n});\n\n// उपभोक्ता\nvar consumer = Task.Run(async () =>\n{\n await foreach (var item in channel.Reader.ReadAllAsync())\n {\n Console.WriteLine($"Processing: {item}");\n await Task.Delay(200);\n }\n});\n\nawait Task.WhenAll(producer, consumer);\n\nकब उपयोग करें: एक ही प्रक्रिया में आंतरिक कतारों के लिए, जब स्थायित्व या वितरित प्रसंस्करण की आवश्यकता न हो।
\n\n2. Hangfire — उन्नत पृष्ठभूमि कार्य पुस्तकालय
\n\nHangfire .NET में पृष्ठभूमि कार्यों के प्रबंधन के लिए सबसे लोकप्रिय पुस्तकालयों में से एक है। यह कतारों, शेड्यूलिंग, पुनः प्रयास और निगरानी का समर्थन करता है।
\n\nमुख्य विशेषताएँ:
\n- \n
- स्थायित्व (SQL Server, Redis, PostgreSQL और अन्य) \n
- निगरानी के लिए वेब इंटरफ़ेस \n
- विलंबित और आवर्ती कार्यों के लिए समर्थन \n
- विफलताओं पर स्वचालित पुनः प्रयास \n
सेटअप और उपयोग का उदाहरण:
\n// स्थापना: Install-Package Hangfire\n// Startup.cs में\npublic void ConfigureServices(IServiceCollection services)\n{\n services.AddHangfire(config =>\n config.UseSqlServerStorage(connectionString));\n services.AddHangfireServer();\n}\n\n// उपयोग\npublic class EmailService\n{\n public void SendWelcomeEmail(int userId)\n {\n // ईमेल भेजने का तर्क\n Console.WriteLine($"Sending email to user {userId}");\n }\n}\n\n// कार्य को कतार में डालना\nBackgroundJob.Enqueue<EmailService>(x => x.SendWelcomeEmail(42));\n\n// विलंबित कार्य\nBackgroundJob.Schedule<EmailService>(\n x => x.SendWelcomeEmail(43), \n TimeSpan.FromMinutes(5)\n);\n\nकब उपयोग करें: वेब अनुप्रयोगों के लिए, जहाँ पुनरारंभ के बीच कार्यों को सहेजने, निगरानी और लचीली शेड्यूलिंग की आवश्यकता होती है।
\n\n3. RabbitMQ.Client — वितरित संदेश कतार
\n\nवितरित प्रणालियों के लिए, जहाँ कई सेवाओं को कार्यों का आदान-प्रदान करना होता है, RabbitMQ का उपयोग किया जाता है। RabbitMQ.Client पुस्तकालय AMQP प्रोटोकॉल तक पूर्ण पहुँच प्रदान करता है।
बुनियादी producer-consumer उदाहरण:
\nusing RabbitMQ.Client;\nusing System.Text;\n\n// Producer\nvar factory = new ConnectionFactory() { HostName = "localhost" };\nusing var connection = factory.CreateConnection();\nusing var channel = connection.CreateModel();\n\nchannel.QueueDeclare(queue: "task_queue",\n durable: true,\n exclusive