আপনি এই বিষয়টিতে আমার এমএসডিএন নিবন্ধটি সহায়ক পেতে পারেন ; আপনাকে কখনasync
এএসপি.এনইটি ব্যবহার করা উচিত , কেবল এএসপি.এনইটি কীভাবে ব্যবহার করবেন তা নয় এই নিবন্ধে আমি প্রচুর জায়গা নিয়েছি async
।
এএসপি.নেট এমভিসিতে অ্যাসিঙ্ক ক্রিয়াগুলি ব্যবহার করে আমার কিছু উদ্বেগ রয়েছে। এটি কখন আমার অ্যাপ্লিকেশনগুলির কার্যকারিতা উন্নত করে এবং কখন - না।
প্রথমে বুঝতে হবে async
/ থ্রেডগুলি মুক্ত করারawait
বিষয়ে । জিইউআই অ্যাপ্লিকেশনগুলিতে, এটি মূলত জিইউআই থ্রেডটি মুক্ত করার বিষয়ে তাই ব্যবহারকারীর অভিজ্ঞতা আরও ভাল। সার্ভার অ্যাপ্লিকেশনগুলিতে (এএসপি.নেট এমভিসি সহ), এটি মূলত অনুরোধের থ্রেডটি মুক্ত করার বিষয়ে যাতে সার্ভারটি স্কেল করতে পারে।
বিশেষত, এটি করবে না:
- আপনার পৃথক অনুরোধগুলি দ্রুত সম্পন্ন করুন। প্রকৃতপক্ষে, তারা ধীরে ধীরে (কেবলমাত্র এক কিশোরী বিট) সম্পূর্ণ করবে।
- আপনি যখন একটি আঘাত করেন তখন কলার / ব্রাউজারে ফিরে যান
await
। await
ব্রাউজারের কাছে নয়, কেবল এএসপি.নেট থ্রেড পুলে কেবল "ফলন" হবে।
প্রথম প্রশ্নটি হচ্ছে - এএসপি.নেট এমভিসির সর্বত্র অ্যাসিঙ্ক অ্যাকশনটি ব্যবহার করা ভাল?
আমি বলব যে আপনি যেখানেই I / O করছেন তা এটি ব্যবহার করা ভাল। এটি অগত্যা উপকারী নাও হতে পারে , যদিও (নীচে দেখুন)।
তবে এটি সিপিইউযুক্ত পদ্ধতিতে ব্যবহার করা খারাপ । কখনও কখনও ডেভসরা মনে করেন যে তারা async
কেবল Task.Run
তাদের নিয়ন্ত্রকগুলিতে কল করে তারা এর সুবিধা পেতে পারেন এবং এটি একটি ভয়াবহ ধারণা। কারণ এই কোডটি অন্য থ্রেড গ্রহণ করে অনুরোধের থ্রেডটি মুক্ত করে শেষ করে, তাই কোনও লাভ নেই (এবং বাস্তবে তারা অতিরিক্ত থ্রেডের স্যুইচগুলির জরিমানা নিচ্ছে)!
যখন আমি ডাটাবেসটি জিজ্ঞাসা করতে চাই তখন কী আমি async ব্যবহার করব / কীওয়ার্ডগুলির জন্য অপেক্ষা করব (EF / NHibernate / অন্যান্য ORM এর মাধ্যমে)?
আপনি উপলব্ধ যে অপেক্ষাকৃত পদ্ধতি ব্যবহার করতে পারেন। এই মুহুর্তে বেশিরভাগ প্রধান খেলোয়াড় সমর্থন করে async
তবে কয়েকটি আছে যা তা দেয় না। যদি আপনার ওআরএম সমর্থন করে না async
, তবে এটিকে Task.Run
বা এর মতো কোনও কিছুতে জড়ানোর চেষ্টা করবেন না (উপরে দেখুন)।
নোট করুন যে আমি বলেছিলাম "আপনি ব্যবহার করতে পারেন"। যদি আপনি একটি একক ডাটাবেস ব্যাকএন্ডের সাথে এএসপি.নেট এমভিসি সম্পর্কে কথা বলছেন তবে আপনি (প্রায় অবশ্যই) এর থেকে কোনও স্কেলিবিলিটি সুবিধা পাবেন না async
। কারণ আইআইএস এসকিউএল সার্ভারের (বা অন্যান্য ক্লাসিক আরডিবিএমএস) একক উদাহরণের চেয়ে অনেক বেশি সমবর্তী অনুরোধগুলি পরিচালনা করতে পারে। তবে, যদি আপনার ব্যাকএন্ডটি আরও আধুনিক হয় - একটি এসকিউএল সার্ভার ক্লাস্টার, অ্যাজুরে এসকিউএল, নোএসকিউএল ইত্যাদি - এবং আপনার ব্যাকএন্ড স্কেল করতে পারে এবং আপনার স্কেলিবিলিটি বাধা আইআইএস হয়, তবে আপনি এর থেকে একটি স্কেলিবিলিটি সুবিধা পেতে পারেন async
।
তৃতীয় প্রশ্ন - একক ক্রিয়াকলাপ পদ্ধতিতে আমি সংখ্যক ডাটাবেসকে জিজ্ঞাসা করতে কীওয়ার্ডের জন্য অপেক্ষা করতে পারি?
আপনার পছন্দ হিসাবে অনেক। তবে নোট করুন যে অনেকগুলি ওআরএম-এর প্রতি-সংযোগের ওয়ান-অপারেশন রয়েছে। বিশেষত, EF কেবলমাত্র DbContext প্রতি একক ক্রিয়াকলাপের অনুমতি দেয়; অপারেশন সিঙ্ক্রোনাস বা অ্যাসিনক্রোনাস কিনা তা সত্য।
এছাড়াও, আপনার ব্যাকএন্ডের স্কেলিবিলিটিটি আবার মনে রাখবেন। আপনি যদি এসকিউএল সার্ভারের একক উদাহরণটি মারছেন, এবং আপনার আইআইএস ইতিমধ্যে এসকিউএল সার্ভারকে সম্পূর্ণ ক্ষমতা ধরে রাখতে সক্ষম হয়, তবে এসকিউএল সার্ভারের উপর চাপ দ্বিগুণ করা বা তিনগুণ বাড়ানো আপনাকে মোটেই সহায়তা করবে না।