मुझे लगता है कि सच्चाई Microsoft दस्तावेज से भी अस्पष्ट है:
विजुअल स्टूडियो 2012 और .NET फ्रेमवर्क 4.5 में, async
कीवर्ड ( Async
विजुअल बेसिक में) के साथ किसी भी विधि को असिंक्रोनस विधि माना जाता है, और C # और विजुअल बेसिक कंप्लायंस TAP का उपयोग करके एसिंक्रोनस तरीके से विधि को लागू करने के लिए आवश्यक परिवर्तन करते हैं। एक अतुल्यकालिक विधि Task
या तो एक या एक Task<TResult>
वस्तु वापस आ जाना चाहिए ।
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
यह पहले से ही ठीक नहीं है। किसी भी विधि के साथ async
अतुल्यकालिक है और फिर यह कहते हुए कि या तो वापस लौटना चाहिए - Task
या Task<T>
जो कॉल स्टैक के शीर्ष पर विधियों के लिए सही नहीं है, उदाहरण के लिए Button_Click, या async void
।
बेशक, आपको विचार करना होगा कि सम्मेलन का क्या मतलब है?
आप कह सकते हैं कि Async
प्रत्यय सम्मेलन एपीआई उपयोगकर्ता के लिए संवाद करने के लिए है कि विधि प्रतीक्षित है। प्रतीक्षा योग्य विधि के लिए, इसे Task
शून्य के Task<T>
लिए या मान-वापसी विधि के लिए लौटना चाहिए , जिसका अर्थ है कि केवल उत्तरार्द्ध के साथ प्रत्यय लगाया जा सकता है Async
।
या आप कह सकते हैं कि Async
प्रत्यय सम्मेलन यह संवाद करने के लिए है कि विधि तुरंत वापस आ सकती है, वर्तमान धागे को त्यागकर अन्य कार्य और संभावित रूप से दौड़ का कारण बन सकती है।
यह Microsoft डॉक्टर उद्धरण कहता है:
अधिवेशन के द्वारा, आप "Async" को उन विधियों के नाम से जोड़ते हैं जिनमें Async या Async संशोधक होता है।
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
जो यह भी उल्लेख नहीं करता है कि आपके स्वयं के अतुल्यकालिक तरीकों को वापस Task
करने के लिए Async
प्रत्यय की आवश्यकता है , जो मुझे लगता है कि हम सभी सहमत हैं कि वे करते हैं।
तो इस सवाल का जवाब हो सकता है: दोनों। दोनों ही मामलों में, आपको कीवर्ड के Async
तरीकों के साथ जुड़ने की जरूरत है async
और वह वापसी Task
या Task<T>
।
मैं स्टीफन Toub से स्थिति स्पष्ट करने के लिए पूछने जा रहा हूँ।
अपडेट करें
तो मैंने किया। और यहाँ हमारे अच्छे आदमी ने क्या लिखा है:
यदि एक सार्वजनिक विधि टास्क-रिटर्निंग है और प्रकृति में अतुल्यकालिक है (एक विधि के विपरीत जिसे हमेशा पूरा करने के लिए तुल्यकालिक रूप से निष्पादित करने के लिए जाना जाता है लेकिन फिर भी किसी कारण के लिए कार्य लौटाता है), इसमें "Async" प्रत्यय होना चाहिए। वह दिशा-निर्देश है। नामकरण के साथ यहां प्राथमिक लक्ष्य कार्यक्षमता के एक उपभोक्ता को यह स्पष्ट करना है कि जिस विधि को लागू किया जा रहा है वह संभवतः अपने सभी कार्यों को समकालिक रूप से पूरा नहीं करेगा; यह निश्चित रूप से उस मामले में भी मदद करता है जहां कार्यक्षमता सिंक्रोनस और अतुल्यकालिक दोनों तरीकों से उजागर होती है जैसे कि आपको उन्हें अलग करने के लिए नाम अंतर की आवश्यकता होती है। यह विधि किस प्रकार अपने अतुल्यकालिक कार्यान्वयन को प्राप्त करती है, नामकरण के लिए अपरिवर्तित है: क्या कंपाइलर की सहायता प्राप्त करने के लिए async / wait का उपयोग किया जाता है, या क्या System.Threading.Tasks से प्रकार और विधियाँ सीधे उपयोग की जाती हैं (e) जी। TaskCompletionSource) वास्तव में कोई फर्क नहीं पड़ता, क्योंकि यह विधि के हस्ताक्षर को प्रभावित नहीं करता है, जहां तक कि विधि के उपभोक्ता का संबंध है।
बेशक, हमेशा एक दिशानिर्देश के अपवाद होते हैं। नामकरण के मामले में सबसे उल्लेखनीय एक ऐसे मामले होंगे जहां एक पूरे प्रकार के raison d'etre को async-केंद्रित कार्यक्षमता प्रदान करना है, जिसमें प्रत्येक विधि पर Async होने के मामले में ओवरक्लिल होगा, जैसे कार्य पर तरीके जो स्वयं कार्य उत्पन्न करते हैं ।
शून्य-वापस लौटने वाली अतुल्यकालिक विधियों के लिए, सार्वजनिक सतह क्षेत्र में उन लोगों को रखना वांछनीय नहीं है, क्योंकि कॉलर के पास यह जानने का कोई अच्छा तरीका नहीं है कि अतुल्यकालिक काम कब पूरा हुआ है। यदि आपको सार्वजनिक रूप से एक शून्य-लौटने वाली अतुल्यकालिक विधि का पर्दाफाश करना चाहिए, हालांकि, आप संभवतः एक ऐसा नाम रखना चाहते हैं जो बताता है कि अतुल्यकालिक कार्य शुरू किया जा रहा है, और यदि आप कोई अर्थ रखते हैं तो आप यहां "Async" प्रत्यय का उपयोग कर सकते हैं। यह देखते हुए कि यह मामला कितना दुर्लभ होना चाहिए, मेरा तर्क है कि यह वास्तव में एक केस-बाय-केस का निर्णय है।
मुझे आशा है कि मदद करता है, स्टीव
स्टीफन के शुरुआती वाक्य से पर्याप्त मार्गदर्शन पर्याप्त स्पष्ट है। इसे बाहर रखा गया है async void
क्योंकि एक अतुल्यकालिक शून्य को लागू करने के सही तरीके से एक सार्वजनिक एपीआई बनाने के लिए यह असामान्य है क्योंकि यह एक सादे Task
उदाहरण को वापस करना है और संकलक को अपने जादू के लिए जाने देना है। हालांकि, यदि आप एक चाहते हैं public async void
, तो अपील करने Async
की सलाह दी जाती है। अन्य टॉप-ऑफ़-स्टैक async void
विधियाँ जैसे कि ईवेंट हैंडलर आमतौर पर सार्वजनिक नहीं होते हैं और मायने नहीं रखते / योग्य नहीं होते हैं।
मेरे लिए, यह मुझे बताता है कि अगर मैं खुद Async
को एक पर प्रत्यय के बारे में सोचता हुआ पाता हूं async void
, तो मुझे शायद इसे बदल देना चाहिए async Task
ताकि कॉल करने वाले इसका इंतजार कर सकें, फिर अपील करें Async
।