ठीक है, यहाँ मेरा इस पर लेना है।
कोरटाइन्स नाम की कोई चीज है जो दशकों से जानी जाती है। ("नथ और हॉपर" -क्लास "दशकों के लिए") वे सबरूटीन के सामान्यीकरण हैं , जैसे कि वे न केवल फ़ंक्शन प्रारंभ और वापसी विवरण पर नियंत्रण प्राप्त करते हैं और जारी करते हैं, बल्कि वे इसे विशिष्ट बिंदुओं ( निलंबन बिंदु) पर भी करते हैं। ) । एक सबरूटीन एक सस्पेंशन है जिसमें कोई निलंबन बिंदु नहीं है।
वे सी मैक्रोज़ के साथ लागू करने के लिए आसान हैं, जैसा कि "प्रोटॉथ्रेड्स" के बारे में निम्नलिखित पेपर में दिखाया गया है। ( http://dunkels.com/adam/dunkels06protothreads.pdf ) इसे पढ़ें। मैं इंतजार करूँगा...
इसकी निचली रेखा यह है कि मैक्रोज़ एक बड़ा switchऔर caseप्रत्येक निलंबन बिंदु पर एक लेबल बनाते हैं । प्रत्येक निलंबन बिंदु पर, फ़ंक्शन तुरंत निम्नलिखित का मान संग्रहीत करता हैcase लेबल , ताकि यह पता चले कि अगली बार निष्पादन को फिर से शुरू करने के लिए कहां कहा जाता है। और यह कॉल करने वाले को नियंत्रण लौटाता है।
यह "प्रोटोथ्रेड" में वर्णित कोड के नियंत्रण के स्पष्ट प्रवाह को संशोधित किए बिना किया जाता है।
अब कल्पना करें कि आपके पास इन सभी "प्रोटोथ्रेड्स" को बदले में एक बड़ा लूप है, और आप समवर्ती रूप से एक ही थ्रेड पर "प्रोटोथ्रेड्स" निष्पादित कर रहे हैं।
इस दृष्टिकोण में दो कमियां हैं:
- आप पुनरारंभ के बीच स्थानीय चर में राज्य नहीं रख सकते।
- आप एक मनमाने कॉल गहराई से "प्रोटोथ्रेड" को निलंबित नहीं कर सकते। (सभी निलंबन बिंदु 0 स्तर पर होने चाहिए)
दोनों के लिए वर्कअराउंड हैं:
- सभी स्थानीय चर को प्रोटोथ्रेड के संदर्भ तक खींचा जाना चाहिए (संदर्भ जो पहले से ही इस तथ्य की आवश्यकता है कि प्रोटॉथ्रेड को अपना अगला पुनरारंभ बिंदु स्टोर करना होगा)
- यदि आपको लगता है कि आपको वास्तव में एक प्रोटोथ्रेड से दूसरे प्रोटोथ्रेड को कॉल करने की आवश्यकता है, तो एक बच्चे को "स्पॉन" फैलाएं और बच्चे के पूरा होने तक निलंबित करें।
और यदि आपके पास मैक्रो और वर्कअराउंड को फिर से लिखने के लिए कंपाइलर सपोर्ट है, तो ठीक है, आप अपने प्रोटॉथ्रेड कोड को वैसे ही लिख सकते हैं जैसे आप एक कीवर्ड के साथ सस्पेंशन पॉइंट डालते हैं।
और यह क्या asyncऔर क्या हैawait सब के बारे में कर रहे हैं: बनाने (stackless) coroutines।
C # में कोरआउट को (जेनेरिक या गैर-जेनेरिक) वर्ग की वस्तुओं के रूप में पुनरीक्षित किया जाता है Task ।
मुझे ये कीवर्ड बहुत भ्रामक लगते हैं। मेरी मानसिक रीडिंग है:
async "संदिग्ध" के रूप में
await "पूरा होने तक सस्पेंड"
Task "भविष्य ..." के रूप में
अभी। क्या हमें वास्तव में फ़ंक्शन को चिह्नित करने की आवश्यकता है async? यह कहने के अलावा कि यह फ़ंक्शन को एक coroutine बनाने के लिए कोड पुनर्लेखन तंत्र को ट्रिगर करना चाहिए, यह कुछ अस्पष्टताओं को हल करता है। इस कोड पर विचार करें।
public Task<object> AmIACoroutine() {
var tcs = new TaskCompletionSource<object>();
return tcs.Task;
}
यह मानते हुए कि asyncयह अनिवार्य नहीं है, क्या यह एक कोरटाइन या सामान्य कार्य है? संकलक को इसे कोरटाइन के रूप में फिर से लिखना चाहिए या नहीं? दोनों अलग-अलग अंतिम शब्दार्थों के साथ संभव हो सकते हैं।