এখানে অন্যান্য উত্তরগুলি সবচেয়ে গুরুত্বপূর্ণ পয়েন্টটি রেখে যাচ্ছে বলে মনে হচ্ছে:
কম লোড সাইটে এটি দ্রুত করার জন্য আপনি যদি কোনও সিপিইউ-নিবিড় ক্রিয়াকলাপকে সমান্তরাল করার চেষ্টা না করেন, তবে কোনও শ্রমিকের থ্রেড ব্যবহার করার কোনও মানে নেই।
এটি উভয় বিনামূল্যে থ্রেডগুলির জন্য যায় যা দ্বারা তৈরি করা হয় new Thread(...)
, এবং কর্মীদের থ্রেড ThreadPool
যা QueueUserWorkItem
অনুরোধের প্রতিক্রিয়া জানায়।
হ্যাঁ, এটি সত্য, আপনি অনেকগুলি কাজের আইটেম সারিবদ্ধ করে একটি এএসপি.এনইটি প্রক্রিয়ায় অনাহারে থাকতে পারেনThreadPool
। এটি ASP.NET কে আরও অনুরোধগুলি প্রক্রিয়া করতে বাধা দেবে। নিবন্ধের তথ্য সেই বিষয়ে সঠিক; অনুরূপ থ্রেড পুল QueueUserWorkItem
অনুরোধগুলি পরিবেশন করতে ব্যবহৃত হয়।
তবে আপনি যদি এই অনাহার ঘটাতে প্রকৃতপক্ষে পর্যাপ্ত কাজের আইটেম সন্ধান করছেন তবে আপনার থ্রেড পুল অনাহারে থাকা উচিত ! আপনি যদি একই সাথে আক্ষরিক অর্ধ শতাধিক সিপিইউ-নিবিড় ক্রিয়াকলাপ চালিয়ে যাচ্ছেন তবে মেশিনটি ইতিমধ্যে ওভারলোড হয়ে গেলে, এএসপি.এনইটি অনুরোধটি পরিবেশন করতে অন্য কর্মী থ্রেডের কী লাভ হবে? আপনি যদি এই পরিস্থিতিতে চলে আসছেন তবে আপনার পুরোপুরি পুনরায় নকশা করা দরকার!
এএসপি.এনইটি-তে মাল্টি-থ্রেড কোডটি অনুপযুক্তভাবে ব্যবহৃত হচ্ছে দেখে বা শুনেছি বেশিরভাগ সময় এটি সিপিইউ-নিবিড় কাজ সন্ধানের জন্য নয়। এটি I / O- সীমাবদ্ধ কাজের জন্য সারিবদ্ধ for এবং আপনি যদি I / O কাজ করতে চান তবে আপনার উচিত একটি I / O থ্রেড (I / O কমপ্লিট পোর্ট)।
বিশেষত, আপনি যে কোনও লাইব্রেরি ক্লাস ব্যবহার করছেন তার দ্বারা সমর্থিত অ্যাসিঙ্ক কলব্যাকগুলি ব্যবহার করা উচিত। এই পদ্ধতিগুলি সর্বদা খুব স্পষ্টভাবে লেবেলযুক্ত; তারা শব্দ Begin
এবং দিয়ে শুরু End
। মতই Stream.BeginRead
, Socket.BeginConnect
, WebRequest.BeginGetResponse
, ইত্যাদি।
এই পদ্ধতির কি ব্যবহার ThreadPool
, কিন্তু তারা IOCPs, যা না ব্যবহার না ASP.NET অনুরোধ হস্তক্ষেপ। এগুলি একটি বিশেষ ধরণের হালকা ওজনের থ্রেড যা I / O সিস্টেমের একটি বিঘ্নিত সংকেত দ্বারা "জাগ্রত" হতে পারে। এবং একটি এএসপি.এনইটি অ্যাপ্লিকেশনটিতে, আপনার প্রতিটি কর্মী থ্রেডের জন্য সাধারণত একটি আই / ও থ্রেড থাকে, তাই প্রতিটি অনুরোধের জন্য একটি অ্যাসিঙ্ক অপারেশন সজ্জিত থাকতে পারে। এটি আক্ষরিক অর্থে শত শত অ্যাসিঙ্ক অপারেশনগুলি কোনও উল্লেখযোগ্য কর্মক্ষমতা হ্রাস ছাড়াই (I / O সাবসিস্টেম ধরে রাখতে পারে তা ধরে নেওয়া) ass এটি আপনার প্রয়োজনের চেয়ে বেশি উপায়।
কেবল মনে রাখবেন যে অ্যাসিঙ্ক প্রতিনিধিরা এভাবে কাজ করেন না - তারা ঠিক যেমন কর্মী থ্রেড ব্যবহার করে শেষ করবেন ThreadPool.QueueUserWorkItem
। এটি কেবলমাত্র নেট নেট ফ্রেমওয়ার্ক লাইব্রেরি ক্লাসগুলির অন্তর্নির্মিত অ্যাসিঙ্ক পদ্ধতিগুলি যা এটি করতে সক্ষম। আপনি নিজেই এটি করতে পারেন, তবে এটি জটিল এবং কিছুটা বিপজ্জনক এবং সম্ভবত এই আলোচনার আওতার বাইরে।
আমার মতে এই প্রশ্নের সেরা উত্তর হ'ল এএসপি.নেট- এ ThreadPool
বা ব্যাকগ্রাউন্ড Thread
উদাহরণটি ব্যবহার করবেন না । এটি একেবারে উইন্ডোজ ফর্ম অ্যাপ্লিকেশনে কোনও থ্রেড কাটানোর মতো নয়, যেখানে আপনি ইউআইকে প্রতিক্রিয়াশীল রাখার জন্য এটি করেন এবং এটি কতটা দক্ষ তা নিয়ে চিন্তা করবেন না। এএসপি.নেটে আপনার উদ্বেগ থ্রুপুট এবং সেই সমস্ত কর্মী থ্রেডের উপর স্যুইচ করা সমস্ত প্রসঙ্গটি আপনি ব্যবহার করছেন বা না করুক তা সম্পূর্ণ আপনার থ্রুপুটটিকে মেরে ফেলবেThreadPool
।
দয়া করে, আপনি যদি এএসপি.এনইটি তে থ্রেডিং কোডটি নিজেকে লেখেন বলে মনে করেন - প্রাক-বিদ্যমান অ্যাসিনক্রোনাস পদ্ধতি ব্যবহার করার জন্য এটি আবার লেখা যেতে পারে কি না তা বিবেচনা করুন এবং যদি তা না পারে তবে দয়া করে বিবেচনা করুন আপনি সত্যই কোডটির প্রয়োজন কিনা মোটেও একটি পটভূমি থ্রেড চালানোর জন্য। সর্বাধিক ক্ষেত্রে, আপনি সম্ভবত কোনও নেট বেনিফিটের জন্য জটিলতা যুক্ত করবেন।