SLaks और किल्करम के उत्तर अच्छे हैं; मैंने सोचा था कि मैं अभी थोड़ा और संदर्भ जोड़ूंगा।
आपका पहला सवाल अनिवार्य रूप से है कि किन तरीकों को चिह्नित किया जा सकता है async।
एक विधि के रूप में चिह्नित asyncवापसी कर सकते हैं void, Taskया Task<T>। उनके बीच क्या अंतर हैं?
एक Task<T>लौटते हुए एस्किंट विधि की प्रतीक्षा की जा सकती है, और जब यह कार्य पूरा हो जाएगा तो यह एक टी को सुरक्षित करेगा।
एक Taskलौटते हुए async विधि की प्रतीक्षा की जा सकती है, और जब कार्य पूरा हो जाता है, तो कार्य की निरंतरता को चलाने के लिए निर्धारित किया जाता है।
ए void लौटाने वाली एस्किंट विधि का इंतजार नहीं किया जा सकता है; यह एक "आग और भूल" विधि है। यह एसिंक्रोनस रूप से काम करता है, और आपके पास यह बताने का कोई तरीका नहीं है कि यह कब किया जाता है। यह थोड़ा अजीब से अधिक है; जैसा कि SLaks कहते हैं, आम तौर पर आप केवल एक अतुल्यकालिक ईवेंट हैंडलर बनाते समय करते हैं। घटना आग, हैंडलर निष्पादित; कोई भी इवेंट हैंडलर द्वारा दिए गए कार्य का "इंतजार" करने वाला नहीं है क्योंकि इवेंट हैंडलर कार्यों को वापस नहीं करता है, और यहां तक कि अगर उन्होंने किया, तो कोड किस चीज के लिए टास्क का उपयोग करेगा? यह आमतौर पर उपयोगकर्ता कोड नहीं है जो पहली बार में हैंडलर को नियंत्रण स्थानांतरित करता है।
आपका दूसरा सवाल, एक टिप्पणी में, अनिवार्य रूप से awaitएड के बारे में हो सकता है :
awaitएड किस प्रकार के तरीके हो सकते हैं ? क्या शून्य-वापसी विधि awaitएड हो सकती है ?
नहीं, शून्य-वापसी विधि की प्रतीक्षा नहीं की जा सकती। संकलक await M()एक कॉल में अनुवाद करता है M().GetAwaiter(), जहां GetAwaiterएक उदाहरण विधि या एक विस्तार विधि हो सकती है। प्रतीक्षित मान एक होना चाहिए जिसके लिए आपको एक वेटर मिल सकता है; स्पष्ट रूप से एक शून्य-वापसी विधि एक मूल्य उत्पन्न नहीं करती है जिससे आप एक वेटर प्राप्त कर सकते हैं।
Task-पूर्ण तरीकों से अचेतन मूल्यों का उत्पादन किया जा सकता है। हम अनुमान लगाते हैं कि तीसरे पक्ष अपनी Task-जैसी वस्तुओं को लागू करना चाहते हैं , जिनकी प्रतीक्षा की जा सकती है, और आप उनकी प्रतीक्षा कर पाएंगे। हालांकि, आपको उन asyncतरीकों को घोषित करने की अनुमति नहीं दी जाएगी जो कुछ भी वापस करते हैं void, लेकिन , Taskया Task<T>।
(अद्यतन: मेरे अंतिम वाक्य को C # के भविष्य के संस्करण द्वारा गलत ठहराया जा सकता है; इसमें async विधियों के लिए कार्य प्रकारों के अलावा अन्य रिटर्न प्रकारों को अनुमति देने का प्रस्ताव है।)
(अद्यतन: ऊपर वर्णित सुविधा ने इसे C # 7. में बनाया)