C# में एसिंक्रोनस प्रोग्रामिंग: शुरुआती लोगों के लिए पूर्ण गाइड
\n\nएसिंक्रोनस प्रोग्रामिंग C# में आधुनिक डेवलपमेंट की प्रमुख अवधारणाओं में से एक है। यह आपके एप्लिकेशन को लंबी अवधि के ऑपरेशनों जैसे फ़ाइल पढ़ना, डेटाबेस क्वेरी या HTTP कॉल के दौरान निष्पादन थ्रेड को ब्लॉक किए बिना प्रतिक्रियाशील बने रहने देता है। इस गाइड में, हम व्यावहारिक उदाहरणों के साथ C# में एसिंक्रोनसिटी की मूल बातें समझेंगे।
\n\nएसिंक्रोनस प्रोग्रामिंग क्या है और इसकी आवश्यकता क्यों है?
\n\nसिंक्रोनस प्रोग्रामिंग में कोड क्रमिक रूप से निष्पादित होता है। यदि आप एक ऐसी मेथड को कॉल करते हैं जो सर्वर से 5 सेकंड प्रतिक्रिया की प्रतीक्षा करती है, तो पूरा थ्रेड (UI या वर्कर) रुक जाता है। एप्लिकेशन "हैंग" हो जाता है। एसिंक्रोनस प्रोग्रामिंग इस समस्या को हल करती है: थ्रेड को ब्लॉक करने के बजाय, मेथड कॉल करने वाले कोड को नियंत्रण लौटा देती है, और जब परिणाम तैयार होता है, तो इसके बारे में सूचित करती है।
\n\nएसिंक्रोनसिटी के मुख्य लाभ:
\n- \n
- UI प्रतिक्रियाशीलता — लंबे ऑपरेशनों के दौरान इंटरफ़ेस हैंग नहीं होता। \n
- स्केलेबिलिटी — सर्वर एप्लिकेशन नए थ्रेड बनाए बिना अधिक अनुरोधों को संभाल सकते हैं। \n
- दक्षता — मुक्त किए गए थ्रेड का उपयोग अन्य कार्यों के लिए किया जाता है। \n
C# में async/await की मूल बातें
\n\nकीवर्ड async और await C# में एसिंक्रोनस प्रोग्रामिंग की नींव हैं। ये C# 5.0 में पेश किए गए और एसिंक्रोनस कोड को लगभग सिंक्रोनस जितना ही सरल बना दिया।
उपयोग के नियम:
\n- \n
- मेथड को
asyncकीवर्ड से चिह्नित किया जाता है। \n - रिटर्न टाइप
Task,Task<T>याvoid(केवल इवेंट हैंडलर के लिए) होना चाहिए। \n - मेथड के अंदर, अन्य एसिंक्रोनस मेथड को
awaitकीवर्ड के साथ कॉल करें। \n
सरल उदाहरण:
\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main(string[] args)\n {\n Console.WriteLine("डाउनलोड शुरू कर रहे हैं...");\n string content = await DownloadWebPageAsync("https://example.com");\n Console.WriteLine($"डाउनलोड किए गए वर्ण: {content.Length}");\n }\n\n static async Task<string> DownloadWebPageAsync(string url)\n {\n using HttpClient client = new HttpClient();\n string result = await client.GetStringAsync(url);\n return result;\n }\n}\n\nध्यान दें: Main मेथड को भी async Task के रूप में चिह्नित किया गया है — यह C# 7.1 से मान्य है।
Task, Task<T> और ValueTask प्रकार
\n\nC# में एसिंक्रोनस प्रोग्रामिंग में तीन मुख्य रिटर्न प्रकार उपयोग किए जाते हैं:
\n\n- \n
Task— उन मेथड के लिए जो मान वापस नहीं करते (void के समान)। \n Task<T>— उन मेथड के लिए जो T प्रकार का मान लौटाते हैं। \n ValueTask<T>— उन परिदृश्यों के लिए अनुकूलित संस्करण जहां परिणाम अक्सर सिंक्रोनस रूप से उपलब्ध होता है (जैसे, कैश से)। \n
Task<T> के साथ उदाहरण:
\nstatic async Task<int> CalculateSumAsync(int a, int b)\n{\n await Task.Delay(1000); // लंबे कार्य का अनुकरण\n return a + b;\n}\n\n// कॉल:\nint result = await CalculateSumAsync(5, 3);\nConsole.WriteLine(result); // 8\n\nएसिंक्रोनस मेथड में त्रुटि प्रबंधन
\n\nएसिंक्रोनस मेथड में अपवादों को मानक try-catch ब्लॉक से संभाला जाता है। हालांकि, एक महत्वपूर्ण बारीकियां है: अपवाद Task ऑब्जेक्ट में संग्रहीत होता है और await का उपयोग करने पर फिर से "फेंका" जाता है।
static async Task<string> ReadFileAsync(string path)\n{\n try\n {\n string content = await File.ReadAllTextAsync(path);\n return content;\n }\n catch (FileNotFoundException ex)\n {\n Console.WriteLine($"फ़ाइल नहीं मिली: {ex.Message