আমি নীচে আপনার নির্দিষ্ট প্রশ্নের উত্তর দেব, তবে আমরা সম্ভবত আমাদের ফলনটি কীভাবে ডিজাইন করেছি এবং অপেক্ষা করব সে সম্পর্কে আমার বিস্তৃত নিবন্ধগুলি কেবল ভালভাবে পড়তে পারেন।
https://blogs.msdn.microsoft.com/ericlippert/tag/continuation-passing-style/
https://blogs.msdn.microsoft.com/ericlippert/tag/iterators/
https://blogs.msdn.microsoft.com/ericlippert/tag/async/
এই নিবন্ধগুলির কিছু এখন পুরানো; উত্পন্ন কোডটি অনেক উপায়ে ভিন্ন। তবে এগুলি আপনাকে কীভাবে কাজ করে তা অবশ্যই ধারণা দেবে।
এছাড়াও, যদি আপনি বুঝতে না পারছেন যে ল্যাম্বডাস কীভাবে ক্লোজার ক্লাস হিসাবে উত্পন্ন হয় তবে প্রথমে এটি বুঝতে হবে । ল্যাম্বডাস নীচে না নিলে আপনি অ্যাসিঙ্কের মাথা বা লেজ তৈরি করবেন না।
যখন একটি প্রত্যাশা পৌঁছে যায়, রানটাইম কীভাবে জানতে পারে যে কোডের টুকরোটি পরবর্তী কীভাবে কার্যকর করা উচিত?
await
হিসাবে উত্পন্ন:
if (the task is not completed)
assign a delegate which executes the remainder of the method as the continuation of the task
return to the caller
else
execute the remainder of the method now
মূলত এটি। ওয়েত হ'ল অভিনব রিটার্ন।
এটি কোথায় ছেড়ে যায় যেখানে এটি আবার শুরু করতে পারে তা কীভাবে জানবে এবং কীভাবে এটি মনে আছে?
ভাল, আপনি কিভাবে অপেক্ষা না করে এটি করবেন ? যখন পদ্ধতি foo পদ্ধতি বারকে কল করে, কোনওভাবে আমাদের মনে আছে কীভাবে foo এর মাঝখানে ফিরে যাব, সমস্ত স্থানীয়দের সাথে foo সক্রিয়করণের অক্ষত অক্ষুণ্ন থাকুক না কেন, বারটি যাই হোক না কেন।
আপনি জানেন কীভাবে এটি এসেম্বলারের মাধ্যমে করা হয়েছে। Foo এর জন্য একটি অ্যাক্টিভেশন রেকর্ডটি স্ট্যাকের উপরে চাপ দেওয়া হয়; এটিতে স্থানীয়দের মূল্যবোধ রয়েছে। কলের বিন্দুতে foo- এ রিটার্ন ঠিকানাটি স্ট্যাকের দিকে ঠেলা দেওয়া হয়। যখন বারটি সম্পন্ন হয়, স্ট্যাক পয়েন্টার এবং নির্দেশ পয়েন্টারটি যেখানে প্রয়োজন সেখানে পুনরায় সেট করা হয় এবং ফু যেখান থেকে ছেড়ে যায় সেখান থেকে চলে যেতে থাকে।
অপেক্ষার ধারাবাহিকতা হুবহু একই, অ্যাক্টিভেশনগুলির ক্রমটি স্ট্যাক তৈরি করে না তার স্পষ্ট কারণে রেকর্ডটি গাদাতে রাখা হয় ।
যে প্রতিনিধিটির অপেক্ষার সাথে সাথে টাস্কটির ধারাবাহিকতা দেয় তা হ'ল (1) এমন একটি সংখ্যা যা একটি লুকিং টেবিলের ইনপুট যা নির্দেশ নির্দেশককে দেয় যে আপনাকে পরবর্তী সম্পাদন করতে হবে, এবং (2) স্থানীয় এবং অস্থায়ী সমস্ত মান।
সেখানে কিছু অতিরিক্ত গিয়ার রয়েছে; উদাহরণস্বরূপ, .NET এ ট্রাই ব্লকের মাঝামাঝি শাখা অবৈধ, সুতরাং আপনি কেবলমাত্র একটি চেষ্টা ব্লকের কোডের ঠিকানাটি টেবিলের মধ্যে আটকে রাখতে পারবেন না। তবে এগুলি বুককিপিংয়ের বিশদ। ধারণামূলকভাবে, অ্যাক্টিভেশন রেকর্ডটি সহজেই গাদাতে সরানো হয়।
বর্তমান কল স্ট্যাকের সাথে কী ঘটে, এটি কোনওভাবে সংরক্ষণ করা যায়?
বর্তমান অ্যাক্টিভেশন রেকর্ডে প্রাসঙ্গিক তথ্যটি প্রথমে স্ট্যাকের উপরে রাখা হয় না; এটি পেতে যেতে থেকে গাদা বন্ধ বরাদ্দ করা হয়। (ভাল, আনুষ্ঠানিক প্যারামিটারগুলি স্ট্যাকের উপর বা নিবন্ধগুলিতে সাধারণত পাস করা হয় এবং তারপরে পদ্ধতিটি শুরু হওয়ার পরে একটি গাদা স্থানে অনুলিপি করা হয়))
কলকারীদের অ্যাক্টিভেশন রেকর্ড সংরক্ষণ করা হয় না; প্রত্যাশা সম্ভবত তাদের কাছে ফিরে আসবে, মনে রাখবেন, যাতে তাদের সাথে সাধারণত আচরণ করা হবে।
দ্রষ্টব্য যে এটি অপেক্ষার সরলিকৃত ধারাবাহিকতা পাস করার শৈলীর সাথে এবং আপনি স্কিমের মতো ভাষায় দেখতে পারা সত্য-কল-সাথে-বর্তমান ধারাবাহিক কাঠামোর মধ্যে একটি জার্মান পার্থক্য। সেই ভাষাগুলিতে কলগুলির মধ্যে ধারাবাহিকতা সহ পুরো ধারাবাহিকতা কল-সিসি দ্বারা ক্যাপচার করা হয় ।
কলিং পদ্ধতিটি অপেক্ষা করার আগে যদি অন্য পদ্ধতিতে কল করে - তবে স্ট্যাকটি ওভাররাইট করা হবে না কেন?
এই পদ্ধতিটি কলটি রিটার্ন করে, এবং তাই তাদের সক্রিয়করণের রেকর্ডগুলি আর অপেক্ষা না করার স্থানে থাকে না।
এবং পৃথিবীতে রানটাইম কীভাবে ব্যতিক্রম এবং স্ট্যাকের উদ্বোধনের ক্ষেত্রে এই সমস্ত কিছু দিয়ে কাজ করবে?
কোনও অনিচ্ছাকৃত ব্যতিক্রম ঘটলে, ব্যতিক্রমটি ধরা পড়ে, কার্যের ভিতরে সঞ্চিত থাকে এবং যখন কার্যের ফলাফল আনতে থাকে তখন আবার ফেলে দেওয়া হয়।
আমি আগে উল্লেখ করা সমস্ত বুককিপিং মনে আছে? ব্যতিক্রম শব্দার্থবিজ্ঞান ডান পাওয়া একটি বিশাল ব্যথা ছিল, আমি আপনাকে বলি।
যখন ফলন পৌঁছে যায়, রানটাইম কীভাবে পয়েন্টগুলি ধরে রাখবে যেখানে জিনিসগুলি বাছাই করা উচিত? পুনরুক্তি রাষ্ট্র কীভাবে সংরক্ষণ করা হয়?
একই ভাবে. স্থানীয়দের রাজ্যের স্তূপের দিকে সরানো হয়েছে, এবং নির্দেশের প্রতিনিধিত্বকারী এমন একটি সংখ্যা যা MoveNext
পরবর্তী সময় বলা হয়ে গেলে পুনরায় শুরু করা উচিত স্থানীয়দের সাথে সংরক্ষণ করা হয়।
এবং আবারও, ব্যতিক্রমগুলি সঠিকভাবে পরিচালনা করা হয়েছে তা নিশ্চিত করার জন্য একটি পুনরাবৃত্তকারী ব্লকে একগুচ্ছ গিয়ার রয়েছে।