আপনার জন্য স্টাফ করে এমন কোনও বস্তুর একটি কাল্পনিক পদ্ধতি বিবেচনা করুন :
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
একজন ব্যাকগ্রাউন্ড ওয়ার্কার হয়ে যাওয়ার জন্য কীভাবে অপেক্ষা করতে পারে?
অতীতে লোকেরা চেষ্টা করেছে:
while (_worker.IsBusy)
{
Sleep(100);
}
তবে এই ডেডলকস , কারণ ইভেন্টটি পরিচালিত IsBusyহওয়ার আগ পর্যন্ত সাফ করা হয় না RunWorkerCompletedএবং অ্যাপ্লিকেশনটি নিষ্ক্রিয় না হওয়া পর্যন্ত ইভেন্টটি পরিচালনা করা যায় না। কর্মী সম্পন্ন না হওয়া পর্যন্ত অ্যাপ্লিকেশন অলস হবে না। (প্লাস, এটি একটি ব্যস্ত লুপ - জঘন্য।
অন্যরা এটিকে বদ্ধ করার পরামর্শ দিয়েছেন:
while (_worker.IsBusy)
{
Application.DoEvents();
}
এর সাথে সমস্যাটি হ'ল Application.DoEvents()বর্তমানে সারিতে থাকা বার্তাগুলি প্রক্রিয়াজাতকরণের কারণ হয়ে থাকে, যার ফলে পুনরায় প্রবেশের সমস্যা হয় (। নেট পুনরায় প্রবেশকারী নয়)।
আমি ইভেন্ট সিঙ্ক্রোনাইজেশন অবজেক্টগুলির সাথে জড়িত কিছু সমাধান ব্যবহার করার আশা করব, যেখানে কোডটি কোনও ইভেন্টের জন্য অপেক্ষা করে - যা কর্মীর RunWorkerCompletedইভেন্ট হ্যান্ডলারগুলি সেট করে। কিছুটা এইরকম:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
তবে আমি অচলাবস্থায় ফিরে এসেছি: অ্যাপ্লিকেশনটি নিষ্ক্রিয় না হওয়া পর্যন্ত ইভেন্ট হ্যান্ডলারটি চলতে পারে না এবং অ্যাপ্লিকেশনটি নিষ্ক্রিয় হবে না কারণ এটি কোনও ইভেন্টের জন্য অপেক্ষা করছে।
সুতরাং আপনি কীভাবে একটি ব্যাকগ্রাউন্ড ওয়ার্কার শেষ করার জন্য অপেক্ষা করতে পারেন?
আপডেট মানুষ এই প্রশ্নটি দ্বারা বিভ্রান্ত বলে মনে হচ্ছে। তাদের মনে হয় যে আমি ব্যাকগ্রাউন্ড ওয়ার্কারকে এইভাবে ব্যবহার করব:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
যে না যে এটা, না আমি কী করছি, এবং যে হয় না এখানে কি জিজ্ঞাসা করা হচ্ছে। যদি এটি হয় তবে পটভূমি কর্মী ব্যবহার করার কোনও মানে হবে না।