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

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

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

کدهای مربوط به کنترل BackgroundWorker

While True
If BackgroundWorker1.CancellationPending Then Return
Dim rnd As New Random()
ListBox1.Items.Add(rnd.Next().ToString)
End While

کدهای مربوط به کنترل BackgroundWorker

while (true){
if (BackgroundWorker1.CancellationPending) return;
Random rnd=new Random();
ListBox1.Items.Add(rnd.Next().ToString);}

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

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

کدهای مربوط به Button

If BackgroundWorker1.IsBusy Then
BackgroundWorker1.CancelAsync()
Else
BackgroundWorker1.RunWorkerAsync()
End If

کدهای مربوط به 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

کدهای مربوط به Form_Load

CheckForIllegalCrossThreadCalls=False;
BackgroundWorker1.WorkerSupportsCancellation=True;

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



نظرات کاربران



عبارت امنیتی : حاصل 1 × 2 می شود :
متن پیام :