আমি একটি পটভূমি থ্রেড চালানোর জন্য একটি কাজ ট্রিগার করতে চাই। আমি কাজগুলি সমাপ্তির জন্য অপেক্ষা করতে চাই না।
নেট 3.5 এ আমি এটি করতাম:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.NET 4-এ টিপিএল প্রস্তাবিত উপায়। আমি যে সাধারণ প্যাটার্নটি সুপারিশ করেছি তা হ'ল:
Task.Factory.StartNew(() => { DoSomething(); });
যাইহোক, StartNew()
পদ্ধতিটি Task
কার্যকর করে এমন একটি বস্তু প্রদান করে IDisposable
। এটি এই প্যাটার্নটির পরামর্শ দেয় এমন লোকদের দ্বারা এটি উপেক্ষা করা হবে বলে মনে হয়। Task.Dispose()
পদ্ধতিটিতে এমএসডিএন ডকুমেন্টেশন বলে:
"আপনি কার্যটিতে আপনার শেষ উল্লেখটি প্রকাশের আগে সর্বদা ডিসপোজকে কল করুন" "
কোনও কাজ শেষ না হওয়া পর্যন্ত আপনি ডিসপোজ কল করতে পারবেন না, সুতরাং মূল থ্রেড ওয়েট এবং কল ডিসপোজ করা প্রথম স্থানে একটি পটভূমির থ্রেডে করার পয়েন্টকে পরাস্ত করবে। এমন কোনও সমাপ্ত / সমাপ্ত ইভেন্ট বলে মনে হয় না যা পরিষ্কার করার জন্য ব্যবহার করা যেতে পারে।
টাস্ক ক্লাসের এমএসডিএন পৃষ্ঠাটি এতে মন্তব্য করে না, এবং "প্রো সি # 2010 ..." বইটি একই প্যাটার্নের প্রস্তাব দেয় এবং টাস্ক নিষ্পত্তি সম্পর্কে কোনও মন্তব্য করে না।
আমি জানি যদি আমি এটি ছেড়ে দিই তবে ফাইনালাইজারটি শেষ পর্যন্ত এটি ধরবে, তবে যখন আমি প্রচুর আগুন লাগাচ্ছি এবং এই জাতীয় কাজগুলি ভুলে যায় এবং ফাইনালাইজার থ্রেডটি অভিভূত হয় তখন কি এটি ফিরে আসবে এবং আমাকে কামড় দিবে?
সুতরাং আমার প্রশ্নগুলি হ'ল:
Dispose()
এক্ষেত্রেTask
ক্লাসে ফোন না করা কি গ্রহণযোগ্য ? এবং যদি তা হয় তবে কেন এবং এর ঝুঁকি / ফলাফল রয়েছে?- এটি নিয়ে যে কোনও ডকুমেন্টেশন রয়েছে তা কি আলোচনা করে?
- অথবা
Task
যে জিনিসটি আমি মিস করেছি তা নিষ্পত্তি করার কোনও উপযুক্ত উপায় আছে ? - নাকি টিপিএলের সাথে ফায়ার ও ভুলে যাওয়া কাজের অন্য কোনও উপায় আছে?