ঠিক আছে, এটি আমার গ্রহণ এখানে।
কর্টাইন নামক একটি জিনিস রয়েছে যা কয়েক দশক ধরে পরিচিত। ("নূথ এবং হপার" -ক্লাস "কয়েক দশক ধরে") এগুলি সাবরুটাইনগুলির সাধারণীকরণ , যেমন তারা কেবল ফাংশন শুরু এবং রিটার্ন বিবৃতিতে নিয়ন্ত্রণ পায় এবং মুক্তি দেয় না, তারা নির্দিষ্ট পয়েন্টগুলিতে ( স্থগিতাদেশ ) ও করে do একটি সাব্রুটিন এমন একটি কর্টিন যা কোনও স্থগিতাদেশ নেই।
সি ম্যাক্রোগুলির সাথে প্রয়োগ করার জন্য তারা সহজেই সহজ, যেমন "প্রোটোথ্রেডস" সম্পর্কে নিম্নলিখিত কাগজে দেখানো হয়েছে। ( http://dunkels.com/adam/dunkels06protothreads.pdf ) এটি পড়ুন। আমি অপেক্ষা করব...
এর নীচের লাইনটি হ'ল ম্যাক্রোগুলি প্রতিটি সাসপেনশন পয়েন্টে একটি বড় switchএবং একটি caseলেবেল তৈরি করে। প্রতিটি সাসপেনশন পয়েন্টে, ফাংশনটি অবিলম্বে নিম্নলিখিত caseলেবেলের মান সঞ্চয় করে , যাতে পরবর্তী সময় যখন ডাকা হয় তখন এটি কার্যকর হয় কোথায় তা জানে। এবং এটি কলারের কাছে নিয়ন্ত্রণ ফিরিয়ে দেয়।
"প্রোটোথ্রেড" বর্ণিত কোডটির আপাত নিয়ন্ত্রণের প্রবাহকে পরিবর্তন না করেই এটি করা হয়।
এখনই কল্পনা করুন যে আপনার কাছে এই সমস্ত "প্রোটোথ্রেডস" পরিবর্তে কল করার একটি বড় লুপ রয়েছে এবং আপনি একই সাথে একক থ্রেডে "প্রোটোথ্রেড" সম্পাদন করতে পারেন।
এই পদ্ধতির দুটি ত্রুটি রয়েছে:
- পুনরায় সংস্থানগুলির মধ্যে আপনি স্থানীয় ভেরিয়েবলগুলিতে রাষ্ট্র রাখতে পারবেন না।
- আপনি "প্রোটোথ্রেড" স্বেচ্ছাচারিত কল গভীরতা থেকে স্থগিত করতে পারবেন না। (সমস্ত সাসপেনশন পয়েন্টগুলি অবশ্যই 0 স্তরে হওয়া উচিত)
উভয়ের জন্য কর্মক্ষেত্র রয়েছে:
- সমস্ত স্থানীয় ভেরিয়েবলগুলি অবশ্যই প্রোটোথ্রিডের প্রসঙ্গে টানা উচিত (প্রসঙ্গটি যা ইতিমধ্যে প্রোটোথ্রেডের পরবর্তী পুনঃস্থাপনের পয়েন্টটি সংরক্ষণ করতে হবে এটি দ্বারা প্রয়োজনীয়)
- আপনি যদি মনে করেন যে আপনাকে সত্যিকার অর্থে একটি প্রোটোথ্রেড থেকে অন্য প্রোটোথারথ কল করতে হবে, তবে একটি শিশু প্রোটোথ্রেডকে "স্পন" করতে হবে এবং সন্তানের সমাপ্তি অবধি স্থগিত করা উচিত।
এবং যদি আপনার ম্যাক্রোগুলি এবং ওয়ার্কআরউন্ডের পুনর্লিখনের কাজটি করার জন্য সংকলক সমর্থন পেয়ে থাকেন তবে ভাল, আপনি আপনার প্রোটোথ্রেড কোডটি লিখতে এবং ঠিক তেমন কোনও কীওয়ার্ড সহ সাসপেনশন পয়েন্টগুলি সন্নিবেশ করিয়ে দিতে পারেন।
এবং এটি যা asyncএবং awaitসমস্ত সম্পর্কে: স্ট্যাকলেস কর্টাইন তৈরি করা।
সি # এর কর্টাইনগুলি (জেনেরিক বা নন-জেনেরিক) শ্রেণীর অবজেক্ট হিসাবে পুনরায় সংশোধন করা হয় Task।
আমি এই কীওয়ার্ডগুলি খুব বিভ্রান্তিকর মনে করি। আমার মানসিক পাঠ্য হ'ল:
async "সাসপেন্সেবল" হিসাবে
await "সম্পূর্ণ না হওয়া পর্যন্ত স্থগিত" হিসাবে
Task "ভবিষ্যত ..." হিসাবে
এখন। আমাদের কি সত্যই ফাংশনটি চিহ্নিত করতে হবে async? ফাংশনটিকে কর্টিন বানানোর জন্য কোড পুনর্লিখনের প্রক্রিয়াগুলির ট্রিগার করা উচিত তা বলা ছাড়াও, এটি কিছু অস্পষ্টতাকেও সমাধান করে। এই কোড বিবেচনা করুন।
public Task<object> AmIACoroutine() {
var tcs = new TaskCompletionSource<object>();
return tcs.Task;
}
ধরে নেওয়া যে asyncএটি বাধ্যতামূলক নয়, এটি কি কোনও কর্টিন বা একটি সাধারণ ক্রিয়াকলাপ? সংকলকটি কি এটি কর্টিন হিসাবে আবার লিখতে হবে? উভয়ই বিভিন্ন ইভেন্টের শব্দার্থক দ্বারা সম্ভব হতে পারে।