C# में एसिंक्रोनस प्रोग्रामिंग उन गतिविधियों के प्रति एक कुशल दृष्टिकोण है जो ब्लॉक होती हैं या जिनकी एक्सेस में देरी होती है। यदि कोई गतिविधि सिंक्रोनस प्रक्रिया में इस तरह ब्लॉक होती है, तो पूरा एप्लिकेशन इंतजार करता है और इसमें अधिक समय लगता है। एप्लिकेशन प्रतिक्रिया देना बंद कर देता है। एसिंक्रोनस दृष्टिकोण का उपयोग करके, एप्लिकेशन अन्य कार्यों के साथ भी जारी रह सकता है।
C# में async और await कीवर्ड्स एसिंक्रोनस प्रोग्रामिंग में उपयोग किए जाते हैं। इनका उपयोग करके, आप .NET Framework संसाधनों, .NET Core आदि के साथ काम कर सकते हैं। Async कीवर्ड का उपयोग करके परिभाषित एसिंक्रोनस मेथड्स को async मेथड्स कहा जाता है।
GUI वाले एप्लिकेशन में, क्यू की सामग्री की जांच की जाती है और यदि कोई अनप्रोसेस्ड टास्क है, तो उसे पहले निकालकर प्रोसेस किया जाता है। कोड सिंक्रोनसली निष्पादित होता है और अनप्रोसेस्ड टास्क पहले पूरा होता है। यदि प्रोसेसिंग में अपेक्षा से अधिक समय लगता है तो एप्लिकेशन "स्टॉप रिस्पॉन्डिंग" संदेश दिखाएगा।
आइए देखें कि ऊपर क्या चर्चा की गई है:
// सिंक्रोनस - UI ब्लॉक करता है
private void OnRequestDownload(object sender, RoutedEventArgs e)
{
var req = HttpWebRequest.Create(_requestedUri);
var res = req.GetResponse(); // ब्लॉकिंग कॉल
}
उपरोक्त समस्या को हल करने के लिए, async और await कीवर्ड्स का उपयोग करें:
// एसिंक्रोनस - UI रिस्पॉन्सिव रहता है
private async void OnRequestDownload(object sender, RoutedEventArgs e)
{
var req = HttpWebRequest.Create(_requestedUri);
var res = await req.GetResponseAsync(); // नॉन-ब्लॉकिंग
}
मुख्य अवधारणाएं
- async: मेथड को एसिंक्रोनस के रूप में चिह्नित करता है, Task या Task<T> रिटर्न करता है
- await: टास्क पूरा होने तक निष्पादन रोकता है, थ्रेड को ब्लॉक नहीं करता
- Task: चल रहे ऑपरेशन का प्रतिनिधित्व करता है
- Task<T>: परिणाम लौटाने वाले ऑपरेशन का प्रतिनिधित्व करता है
लाभ
- UI रिस्पॉन्सिवनेस बनी रहती है
- बेहतर संसाधन उपयोग (थ्रेड ब्लॉक नहीं होते)
- स्केलेबिलिटी में सुधार (सर्वर एप्लिकेशन्स के लिए)
- कोड पठनीयता - सिंक्रोनस जैसा दिखता है
सर्वोत्तम अभ्यास
- async void केवल इवेंट हैंडलर्स के लिए उपयोग करें
- अन्य सभी मामलों में Task या Task<T> रिटर्न करें
- .ConfigureAwait(false) का उपयोग लाइब्रेरी कोड में करें
- ब्लॉकिंग कॉल्स (.Result, .Wait()) से बचें