এটা কি হাইব্রিড ধরণের জিনিস? (যেমন, আমার। নেট প্রোগ্রাম কোনও স্ট্যাক ব্যবহার না করে যতক্ষণ না এটি অ্যাসিঙ্ক কলটি হিট করে তারপরে শেষ না হওয়া পর্যন্ত অন্য কোনও কাঠামোতে স্যুইচ না করে, সেই স্ট্যাকটি এমন অবস্থায় ফিরে যায় যেখানে এটি পরবর্তী আইটেমগুলির বিষয়ে নিশ্চিত হতে পারে ইত্যাদি? )
হ্যাঁ হ্যাঁ
ধরুন আমাদের আছে
async void MyButton_OnClick() { await Foo(); Bar(); }
async Task Foo() { await Task.Delay(123); Blah(); }
ধারাবাহিকতাগুলি কীভাবে পুনরায় সংশোধিত হয় তার একটি অত্যন্ত সরল ব্যাখ্যা এখানে । আসল কোডটি যথেষ্ট জটিল, তবে এটি ধারণাটি পায়।
আপনি বোতামটি ক্লিক করুন। একটি বার্তা সারিবদ্ধ করা হয়েছে। বার্তাটির লুপ বার্তাটি প্রসেস করে এবং ক্লিক হ্যান্ডলারকে কল করে বার্তাটির সারির ফেরতের ঠিকানাটি স্ট্যাকের উপরে রাখে। এটি হ্যান্ডলারটি সম্পন্ন করার পরে যে জিনিসটি ঘটে তা হ'ল বার্তাটির লুপটি চলতে থাকবে। সুতরাং হ্যান্ডলারের ধারাবাহিকতাটি লুপ।
ক্লিকের হ্যান্ডলারটি ফু () কে কল করে, নিজের ফেরতের ঠিকানাটি স্ট্যাকের মধ্যে রেখে। অর্থাৎ ফু এর ধারাবাহিকতা হ্যান্ডলারের অবশিষ্ট অংশ।
ফু তার নিজের ফিরতি ঠিকানাটি স্ট্যাকের মধ্যে রেখে, টাস্ককে ডেকে ডেকে দেয়।
টাস্ক.ডেলি তাত্ক্ষণিকভাবে কোনও টাস্ক ফেরত দেওয়ার জন্য যা কিছু যাদু করার প্রয়োজন তা করে। স্ট্যাকটি পপ করা হয়েছে এবং আমরা ফু-এ ফিরে এসেছি।
Foo এটি সম্পন্ন হয়েছে কিনা তা দেখানোর জন্য ফেরত টাস্কটি পরীক্ষা করে। এইটা না. ধারাবাহিকতা এর অপেক্ষায় রয়েছেন তাই ফু একটি প্রতিনিধি যা বাজে (কল) তৈরি করে, এবং লক্ষণ যে কাজের ধারাবাহিকতা হিসেবে দায়িত্বপ্রাপ্ত, বাজে কথা (কল) হয়। (আমি কেবলমাত্র একটি সামান্য ভুল বক্তব্য দিয়েছি; আপনি কি এটি ধরেন? যদি তা না হয় তবে আমরা এটি মুহূর্তের মধ্যে প্রকাশ করব))
তারপরে ফু তার নিজস্ব টাস্ক অবজেক্ট তৈরি করে, এটিকে অসম্পূর্ণ হিসাবে চিহ্নিত করে এবং স্ট্যাকটিকে ক্লিক হ্যান্ডলারের কাছে ফিরিয়ে দেয়।
ক্লিক হ্যান্ডলার ফু এর কাজ পরীক্ষা করে এবং এটি অসম্পূর্ণ আবিষ্কার করে। হ্যান্ডলারের অপেক্ষার ধারাবাহিকতাটি বার () কে কল করা হয়, তাই ক্লিক হ্যান্ডলারটি একটি প্রতিনিধি তৈরি করে যা বার () কে কল করে এবং এটি ফু () দ্বারা ফিরে আসা টাস্কের ধারাবাহিকতা হিসাবে সেট করে। এরপরে এটি স্ট্যাকটিকে বার্তা লুপে ফিরিয়ে দেয়।
বার্তা লুপ বার্তাগুলি প্রক্রিয়াজাত রাখে। অবশেষে বিলম্ব কার্য দ্বারা তৈরি টাইমার যাদুটি তার কাজটি করে এবং কাতারে একটি বার্তা পোস্ট করে যে বিলম্ব কার্যটির ধারাবাহিকতা এখন কার্যকর করা যেতে পারে। সুতরাং বার্তা লুপটি যথারীতি স্ট্যাকের উপরে রেখে নিজেকে টাস্কের ধারাবাহিকতা বলে। সেই প্রতিনিধি বালাহ () কে ডাকে। বেলা () যা করে তা করে এবং স্ট্যাকটি ফিরিয়ে দেয়।
এখন কি হয়? এখানে জটিল কিছু। বিলম্ব কাজের ধারাবাহিকতা নেই শুধুমাত্র বাজে কল ()। এটি বার () তে একটি কলও ট্রিগার করতে হবে , তবে সেই কাজটি বার সম্পর্কে জানে না!
ফু প্রকৃতপক্ষে একটি প্রতিনিধি তৈরি করেছিল যা (1) ব্লেহ () কে ডাকে এবং (2) ফু যে কার্য সম্পাদন করেছে এবং ইভেন্ট হ্যান্ডলারের কাছে ফিরিয়ে দিয়েছে সেই কাজটির ধারাবাহিকতাটিকে কল করে। এভাবেই আমরা একটি প্রতিনিধিকে কল করি যা বার () বলে।
এবং এখন আমরা যা করতে আমাদের প্রয়োজন তা যথাযথভাবে করেছি। তবে আমরা ম্যাসেজের লুপে বার্তাগুলি খুব দীর্ঘ সময়ের জন্য প্রক্রিয়াকরণ বন্ধ করি নি, তাই আবেদনটি প্রতিক্রিয়াশীল থেকে যায়।
এই পরিস্থিতিতে একটি স্ট্যাকের জন্য খুব উন্নত যে সঠিক ধারণা দেয়, কিন্তু স্ট্যাকটির পরিবর্তে কী?
প্রতিনিধিদের ক্লোজার ক্লাসের মাধ্যমে একে অপরের সাথে রেফারেন্স যুক্ত টাস্ক অবজেক্টের একটি গ্রাফ। এই ক্লোজার ক্লাসগুলি হ'ল রাষ্ট্রীয় মেশিনগুলি যা সর্বাধিক মৃত্যুদন্ড প্রাপ্ত প্রতীক্ষার অবস্থান এবং স্থানীয়দের মূল্যবোধ সম্পর্কে নজর রাখে। প্লাস, প্রদত্ত উদাহরণে, অপারেটিং সিস্টেম দ্বারা প্রয়োগ করা ক্রিয়াকলাপগুলির একটি বিশ্ব-রাষ্ট্রীয় সারি এবং এই ক্রিয়াগুলি কার্যকর করে এমন বার্তা লুপ।
অনুশীলন: আপনি কীভাবে মনে করেন যে কোনও বার্তা লুপ ছাড়াই এই সমস্ত কাজ করে? উদাহরণস্বরূপ, কনসোল অ্যাপ্লিকেশনগুলি। একটি কনসোল অ্যাপ্লিকেশনে অপেক্ষা করা একেবারে আলাদা; আপনি এতদূর যা জানেন তা থেকে এটি কীভাবে কাজ করে তা আপনি কি অনুমান করতে পারেন?
আমি এই বছরগুলি আগে যখন জানলাম, স্ট্যাকটি সেখানে ছিল কারণ এটি বজ্র দ্রুত এবং লাইটওয়েট ছিল, গাদা থেকে দূরে প্রয়োগের সময় বরাদ্দকৃত মেমরির এক টুকরো কারণ এটি হাতের কাজটির জন্য অত্যন্ত দক্ষ ব্যবস্থাপনাকে সমর্থন করেছিল (পাং উদ্দেশ্যে)? কি পরিবর্তন হয়েছে?
পদ্ধতি অ্যাক্টিভেশনগুলির লাইফ টাইম যখন স্ট্যাক গঠন করে তখন স্ট্যাকগুলি একটি দরকারী ডেটা কাঠামো, তবে আমার উদাহরণে ক্লিক হ্যান্ডলারের সক্রিয়করণ, ফু, বার এবং ব্লাহ স্ট্যাক গঠন করে না। এবং সেইজন্য ডেটা স্ট্রাকচার যা সেই কার্যপ্রবাহকে উপস্থাপন করে তা স্ট্যাক হতে পারে না; বরং এটি হ্যাপ-বরাদ্দকৃত কার্যগুলির একটি গ্রাফ এবং কোনও কার্যপ্রবাহের প্রতিনিধিত্বকারী প্রতিনিধি। প্রতীক্ষাগুলি কর্মপ্রবাহের পয়েন্টগুলি যেখানে কাজ শুরু না হওয়া অবধি ওয়ার্কফ্লোতে আরও অগ্রগতি করা যায় না; আমরা অপেক্ষা করার সময়, আমরা অন্যান্য কাজগুলি সম্পাদন করতে পারি যা নির্দিষ্টভাবে শুরু হওয়া কাজগুলি সম্পন্ন হওয়ার উপর নির্ভর করে না ।
স্ট্যাক কেবল ফ্রেমের একটি অ্যারে, যেখানে ফ্রেমগুলি (1) ফাংশনের মাঝখানে পয়েন্টার (যেখানে কলটি ঘটেছিল) এবং (2) স্থানীয় ভেরিয়েবল এবং টেম্পসের মান থাকে। কাজের ধারাবাহিকতা একই জিনিস: প্রতিনিধি ফাংশনটির জন্য নির্দেশক এবং এতে একটি রাষ্ট্র রয়েছে যা ফাংশনের মাঝখানে একটি নির্দিষ্ট পয়েন্ট উল্লেখ করে (যেখানে প্রতীক্ষাটি ঘটেছিল), এবং সমাপনীতে প্রতিটি স্থানীয় পরিবর্তনশীল বা অস্থায়ী জন্য ক্ষেত্র রয়েছে । ফ্রেমগুলি এখন আর একটি সুন্দর ঝরঝরে অ্যারে গঠন করে না, তবে সমস্ত তথ্য একই।