PDA

View Full Version : آموزش: آموزش استفاده از کنترل BackgroundWorker



shayegan10
یک شنبه 02 تیر 1392, 15:22 عصر
در برنامه نویسی های تحت ویندوز پیش می آید که برنامه نویس بخواهد قطعه کدی را به صورت موازی با پروسس های دیگر هم زمان اجرا کرده یا اینکه کاری را در پشت کارهای اصلی در زمان نا محدود انجام دهد. بطور معمول زمانی که از حلقه های بینهایت استفاده می کنیم برنامه دچار خطا و مشکل می شود و راه حل این مشکل را ما برای شما خواهیم گفت. با استفاده از کنترلی با نام BackgroundWorker که دات نت در اختیار ما قرار داده است می توانیم به راحتی کدهای مختلفی را به صورت موازی و همزمان اجرا کنیم یا از طرفی پروسس های مختلفی را همزمان اجرا کنیم. البته نا گفته نماند که این روش در CPUهای امروزی کاربرد دارد زیرا از قابلیت چند هسته ای برخوردارند و می تواند هر هسته یک پروسس را انجام دهد. برای فهم بیشتر با یک مثال این ابزار را معرفی خواهیم کرد. ما در اینجا با استفاده از یک Button و Listbox و کنترل BackgroundWorker برنامه ای خواهیم نوشت ، به این صورت که زمان که روی دکمه کلیک شود اعداد تصادفی به تعداد نا محدود ایجاد شده و به Listbox اضافه گردد و زمانی که مجدداً روی دکمه کلیک شود این عملیات متوقف شود. برای این منظور کنترل ها را روی صفحه گذاشته، بر روی BackgroundWorker دوبار کلیک کرده تا وارد بخش کدنویسی شوید سپس به کدهای زیر توجه فرمائید :

کدهای مربوط به کنترل BackgroundWorker
while (true){
if (BackgroundWorker1.CancellationPending) return;
Random rnd=new Random();
ListBox1.Items.Add(rnd.Next().ToString);}

همانطور که در کدها قابل مشاهده است یک حلقه بینهایت قرار دادیم و در بین آن اعداد تصادفی را ایجاد کرده و به Listbox اضافه کردیم. اما در مورد خط دوم باید گفته شود که این خط برای چک کردن توقف انجام عملیات است و برای این قرار داده شده است که اگر نیاز بود عملیات قطع شود، دیگر کدهای درون حلقه اجرا نشود.

حال باید BackgroundWorker را فعال کنیم تا کدهای درون حلقه اجرا شود. برای این منظور بر روی Button دوبار کلیک کنید تا وارد بخش کدنویسی شوید سپس کدهای زیر را در قسمت مربوطه قرار دهید :

کدهای مربوط به Button
if (BackgroundWorker1.IsBusy){
BackgroundWorker1.CancelAsync();
}else{
BackgroundWorker1.RunWorkerAsync();}

در اینجا با یک دستور IF چک کردیم که اگر BackgroundWorker در حال اجرا است آن را متوقف و در غیر این صورت آن را اجرا کند.

در نهایت یک نکته بسیار مهم قابل ذکر است که کنترل BackgroundWorker زمانی که می خواهد با کنترل دیگری مانند Listbox و غیره کار کند ، دچار خطا شده و کدهای مربوطه را اجرا نمی کند. برای رفع این مشکل دو راه وجود دارد که ما نیز این روش را توصیه می کنیم و آن استفاده از Delegate می باشد. آموزش استفاده از Delegate در بخش های دیگر موجود است و می توانید استفاده کنید اما یک راه دیگر که بسیار هم ساده است وجود دارد و آن اضافه کردن قطعه کد زیر به قسمت Load فرم می باشد. برای این منظور روی فرم دوبار کلیک کرده و در قسمت کدنویسی و بخش Form_Load قطعه کد زیر را استفاده نمائید :


کدهای مربوط به Form_Load
CheckForIllegalCrossThreadCalls=False;
BackgroundWorker1.WorkerSupportsCancellation=True;

خط اول برای رفع مشکل گفته شده می باشد و حتماً باید استفاده شود اما برای خط دوم ، در صورتی که قصد متوقف کردن BackgroundWorker را ندارید می توانید استفاده نکنید.