यह कार्रवाई में C # उपज कीवर्ड है - यह wwwऑब्जेक्ट के साथ कुछ विशेष नहीं कर रहा है , बल्कि इसका मतलब है कि इसमें निहित विधि के लिए कुछ विशेष है। विशेष रूप से इस कीवर्ड का उपयोग केवल उस विधि में किया जा सकता है जो IEnumerable(या IEnumerator) वापस लौटाता है , और इसका उपयोग किया जाता है। इस बात को इंगित करने के लिए कि MoveNext को कहा जाता है , तो एन्यूमरेटर द्वारा किस वस्तु को "वापस" किया जाएगा ।
यह काम करता है क्योंकि कंपाइलर पूरी विधि को एक अलग वर्ग में परिवर्तित करता है जो राज्य मशीन का उपयोग करके IEnumerable(या IEnumerator) लागू करता है - शुद्ध परिणाम यह है कि विधि का शरीर तब तक निष्पादित नहीं होता है जब तक कि कोई रिटर्न वैल्यू के माध्यम से गणना नहीं करता है। यह किसी भी प्रकार के साथ काम करेगा WWW, इसके बारे में कुछ भी विशेष नहीं है , बल्कि इसकी विधि है जो विशेष है।
C # कंपाइलर कोड के किस प्रकार के लिए C # यील्ड कीवर्ड के दृश्यों के पीछे एक नज़र डालें, C # कंपाइलर किस तरह का उत्पन्न होता है, या केवल IL जासूस जैसी किसी चीज़ का उपयोग करके कोड का स्वयं प्रयोग और निरीक्षण करते हैं
अपडेट: स्पष्ट करने के लिए
- जब एकता ने एक कोरटाइन को कॉल किया, जिसमें एक
yield returnबयान होता है, जो यह है कि एक एन्यूमरेटर लौटाया जाता है - इस बिंदु पर किसी भी विधि निकाय को निष्पादित नहीं किया जाता है
MoveNextअनुक्रम को पहला मान प्राप्त करने के लिए एकता को निष्पादित करने के लिए विधि निकाय को प्राप्त करने के लिए एकता पर कॉल करना होगा । यह विधि को पहले yeild returnकथन तक निष्पादित करने का कारण बनता है , जिस बिंदु पर कॉलर फिर से शुरू होता है (और संभवतः एकता बाकी फ्रेम को प्रस्तुत करने के लिए जाती है)
- जैसा कि मैं इसे एकता को सामान्य रूप से समझता हूं तो कॉल करने के लिए आगे बढ़ता है
MoveNext प्रत्येक बाद के फ्रेम में एक बार इट्रेटर पर विधि , जिससे विधि अगले yield returnफ्रेम में एक बार फिर से निष्पादित होती है , जब तक कि विधि का अंत या एक yield breakबयान तक नहीं पहुंच जाता है (संकेत करता है अनुक्रम का अंत)
केवल विशेष बिट यहाँ (और एक में जोड़ी के अन्य मामलों ) है कि एकता इस विशेष इटरेटर अगले फ्रेम अग्रिम नहीं करता है, बजाय यह केवल इटरेटर जब डाउनलोड पूर्ण हो गया (क्रियान्वित जारी रखने के लिए विधि के कारण) अग्रिम। हालाँकि ऐसा प्रतीत होता है कि एक आधार YieldInstruction वर्ग है, जिसमें संभवतः एकता को संकेत देने के लिए एक जेनेरिक तंत्र शामिल है जब एक पुनरावृत्त को उन्नत किया जाना चाहिए, WWWवर्ग इस वर्ग से विरासत में प्रकट नहीं होता है, इसलिए मैं केवल यह मान सकता हूं कि एक विशेष मामला है एकता इंजन में यह वर्ग।
बस स्पष्ट होने के लिए - yieldकीवर्ड कुछ विशेष नहीं करता हैWWW वर्ग के , बल्कि इसकी विशेष हैंडलिंग जो यूनिटी रिटर्न एन्यूमरेशन के सदस्यों को देती है जो इस व्यवहार का कारण बनती है।
दूसरा अपडेट करें:WWW वेब पेज डाउनलोड करने के लिए उपयोग करने वाले तंत्र के रूप में एसिंक्रोनस रूप से यह शायद HttpWebRequest.BeginGetResponse विधि का उपयोग करता है जो आंतरिक रूप से एसिंक्रोनस आईओ का उपयोग करेगा या वैकल्पिक रूप से यह थ्रेड्स का उपयोग कर सकता है (या तो एक समर्पित धागा बनाने या थ्रेड पूल का उपयोग करके)।
yield returnअतुल्यकालिक संचालन के लिए उपयोग करना एक हैक है। "वास्तविक" C # प्रोग्राम में, आप इसके लिए उपयोग करेंगेTask। एकता शायद उनका उपयोग नहीं कर रही है क्योंकि इसे पहले बनाया गया था। नेट 4.0, जबTaskपेश किया गया था।