কিছু সময়ের জন্য সি # এর অ্যাসিঙ্ক / প্রত্যাশার প্যাটার্নটির সাথে ডিল করার পরে, হঠাৎ আমি উপলব্ধি করেছিলাম যে নিম্নলিখিত কোডটিতে কী ঘটেছিল তা কীভাবে ব্যাখ্যা করতে হবে তা আমি সত্যিই জানি না:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
প্রত্যাশিত প্রত্যাবর্তন হিসাবে ধরে নেওয়া হয় Task
যা ধারাবাহিকতা সম্পাদন করা হলে থ্রেড স্যুইচ হতে পারে বা নাও পারে।
অপেক্ষাটি কোনও লুপের ভিতরে না থাকলে আমি বিভ্রান্ত হব না। আমি স্বাভাবিকভাবেই আশা করতাম যে বাকী পদ্ধতিটি (অর্থাৎ ধারাবাহিকতা) সম্ভবত অন্য থ্রেডে চালিত হবে, যা ভাল fine
তবে, একটি লুপের ভিতরে, "পদ্ধতিটির বাকী অংশ" ধারণাটি আমার কাছে কিছুটা কুয়াশাচ্ছন্ন হয়ে পড়ে।
থ্রেডটি যদি ধারাবাহিকতা চালু রাখে তবে বনাম বনাম যদি এটি পরিবর্তন না হয় তবে কী হবে? লুপটির পরবর্তী পুনরাবৃত্তি কোন থ্রেডে সঞ্চালিত হয়?
আমার পর্যবেক্ষণগুলি (শেষ পর্যন্ত যাচাই করা হয়নি) দেখায় যে প্রতিটি পুনরাবৃত্তি একই থ্রেডে শুরু হয় (মূলটি) যখন ধারাবাহিকতা অন্যটিতে চালিত হয়। এটা কি সত্যিই হতে পারে? যদি হ্যাঁ, তবে এটি কি এমন এক অপ্রত্যাশিত সমান্তরালতা যেখানে গেটওয়ার্কএন্সিঙ্ক পদ্ধতির ভিজ-এ-ভিজ্য থ্রেড-সুরক্ষার জন্য গণনা করা দরকার?
আপডেট: আমার প্রশ্নটি সদৃশ নয়, কারওর দ্বারা পরামর্শ দেওয়া হয়েছে। while (!_quit) { ... }
কোড প্যাটার্ন নিছক আমার প্রকৃত কোডের একটা সরলীকৃত ব্যবস্থা। বাস্তবে, আমার থ্রেডটি একটি দীর্ঘকালীন লুপ যা নিয়মিত বিরতিতে (ডিফল্টরূপে প্রতি 5 সেকেন্ড) তার কাজের আইটেমগুলির ইনপুট সারিটি প্রক্রিয়া করে। প্রকৃত প্রস্থান শর্ত চেক এছাড়াও নমুনা কোড দ্বারা প্রস্তাবিত হিসাবে সাধারণ ক্ষেত্র চেক নয়, বরং ইভেন্ট ইভেন্ট হ্যান্ডেল চেক।