PDA

View Full Version : آموزش: backgroundWorker چیست و چه کار می کند



khokhan
چهارشنبه 27 دی 1391, 19:23 عصر
هنگام افزایش حجم داده در برنامه انجام برخی کارها سیستم رو تحت تاثیر قرار می ده وکاربر رو به اشتباه

می اندازه وممکن است برای مدت کوتاهی پاسخگویی برنامه رو مختل کنه

در این مواقع برای اینکه کاربر رو آگاه کنیم که برای مدت کوتاهی صبر کند از backgroundWorker استفاده می کنیم

صدور یک پیغام یا اجرای یک پروگرس بار از جمله کارهایی است که برنامه سازان استفاده می کنند

برای اینکه با نحوه کار این کنترل آشنا بشین نمونه ای رو باهم مرور می کنیم به این شرح :

پروژهای رو ایجاد کنید و یک باتن ، 2 عدد لیبل ، یک پروگرس بار ویک backgroundWorker درون فرم قراردهید


حالا نوبت به کد نویسی می رسد


1 . در محل تعریف کلاس فرم این یه خط رو قراردهید


public partial class Form1 : Form
{
BackgroundWorker bgw = new BackgroundWorker();
public Form1()

2 . در رویداد BackgroundWorker ، ProgressChanged می نویسید :


progressBar1.Value = e.ProgressPercentage;
label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
label2.Text = String.Format("Total items transfered: {0}", e.UserState);

3 . در رویداد DoWork این طور بنویسین


int total = 57;

for (int i = 0; i <= total; i++)
{

System.Threading.Thread.Sleep(100);
int percents = (i * 100) / total;
bgw.ReportProgress(percents, i);
}

4 در رویداد RunWorkerCompleted هم برای کار هنگام پایان کار همه چیز متوقف بشه بنویسید


rogressBar1.Enabled = false;
label1.Text = "done ";
label2.Text = "done ";

5. در نهایت در رویداد کلیک باتن هم اینطوری می نویسین


progressBar1.Style = ProgressBarStyle.Marquee;

progressBar1.Enabled = true;
bgw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_Prog ressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_R unWorkerCompleted);
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();


خوب حالا می تونین اجرا کنین

دفعه بعد با یه کد پیشرفته تر می آم خدمتتون :لبخند:

بدرود تابعد

khokhan
چهارشنبه 27 دی 1391, 19:30 عصر
یه چیزی یادم رفت بگم اگه در رویداد DoWork عدد 57 و 100 رو کاهش یا افزایش بدید اتفاق جالبی پیش می آد :لبخند:

Restlesa
چهارشنبه 27 دی 1391, 22:22 عصر
ممنونم دوست عزیز
یه توضیحی هم در مورد رویداد های ابزار BackgroundWorker بدین
ممنون

danialafshari
چهارشنبه 27 دی 1391, 22:28 عصر
یه pdf هم دارم
اینم تنگش

khokhan
جمعه 29 دی 1391, 16:58 عصر
با سلام ختدمت همه دوستان

برای این قسمت نمونه برنامه ای رو آماده کردم که نحوه استفاده از backgroundWorker رو با لود شدن اطلاعات در دیتا گرید ویو رو نشون می ده

نکته قابل توجه در این برنامه رنک آمیزی ردیفها با توجه به محتوای آن می مباشد :لبخند:

امیدوارم مفید بوده باشد

khokhan
جمعه 29 دی 1391, 22:35 عصر
این هم یک نمونه با wpf

دیدم جالبه گفتم دوستان هم ازش بی بهره نباشن

sepide_68_91
یک شنبه 01 بهمن 1391, 10:03 صبح
هنگام افزایش حجم داده در برنامه انجام برخی کارها سیستم رو تحت تاثیر قرار می ده وکاربر رو به اشتباه

می اندازه وممکن است برای مدت کوتاهی پاسخگویی برنامه رو مختل کنه

در این مواقع برای اینکه کاربر رو آگاه کنیم که برای مدت کوتاهی صبر کند از backgroundWorker استفاده می کنیم

صدور یک پیغام یا اجرای یک پروگرس بار از جمله کارهایی است که برنامه سازان استفاده می کنند

برای اینکه با نحوه کار این کنترل آشنا بشین نمونه ای رو باهم مرور می کنیم به این شرح :

پروژهای رو ایجاد کنید و یک باتن ، 2 عدد لیبل ، یک پروگرس بار ویک backgroundWorker درون فرم قراردهید


حالا نوبت به کد نویسی می رسد


1 . در محل تعریف کلاس فرم این یه خط رو قراردهید


public partial class Form1 : Form
{
BackgroundWorker bgw = new BackgroundWorker();
public Form1()

2 . در رویداد BackgroundWorker ، ProgressChanged می نویسید :


progressBar1.Value = e.ProgressPercentage;
label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
label2.Text = String.Format("Total items transfered: {0}", e.UserState);

3 . در رویداد DoWork این طور بنویسین


int total = 57;

for (int i = 0; i <= total; i++)
{

System.Threading.Thread.Sleep(100);
int percents = (i * 100) / total;
bgw.ReportProgress(percents, i);
}

4 در رویداد RunWorkerCompleted هم برای کار هنگام پایان کار همه چیز متوقف بشه بنویسید


rogressBar1.Enabled = false;
label1.Text = "done ";
label2.Text = "done ";

5. در نهایت در رویداد کلیک باتن هم اینطوری می نویسین


progressBar1.Style = ProgressBarStyle.Marquee;

progressBar1.Enabled = true;
bgw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_Prog ressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_R unWorkerCompleted);
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();


خوب حالا می تونین اجرا کنین

دفعه بعد با یه کد پیشرفته تر می آم خدمتتون :لبخند:

بدرود تابعد

سلام دوست عزیز من کدهای شما رو عینا بکار بردم اما موقع کلیک رو باتن این خطا ظاهر میشه
اگه ممکنه راهنمایی بفرمایید
ممنون

روی خط
bgw.ReportProgress(percents, i);
ظاهر میشه
This BackgroundWorker states that it doesn't report progress. Modify WorkerReportsProgress to state that it does report progress.

khokhan
یک شنبه 01 بهمن 1391, 12:41 عصر
سلام

دوست عزیز بیا درستش کردم واست :لبخند:

موفق باشید

samadblaj
دوشنبه 02 بهمن 1391, 10:32 صبح
واقعا دستت درد نکنه خیلی خیلی عالی بود مرسی

khokhan
دوشنبه 02 بهمن 1391, 23:10 عصر
نمونه برنامه ذخیره فرم در کلاس واستفاده از آن در سایر پروژه ها

daneshjo90
سه شنبه 03 بهمن 1391, 01:10 صبح
با سلام
واقعا جالب و کاربردی بود
دستت مرسی

Shahram_12
سه شنبه 03 بهمن 1391, 03:42 صبح
با سلام و تشکز آموزش

نمونه ایجاد فرم در کلاس رو دیدم ممنون مشکل اینجاست

اگر فرممون در کلاس ایجاد بشه و بعد بخواهیم کنترلهامون رو به اون اضافه کنیم چطور میتونیم

یا اینکه از اون فرم بخواهیم چند بار استفاده کنیم و هر بار هم کنترلهای اون متفاوت باشه چگونه اون رو میتونیم فرا خوانی کنیم

با سپاس از لطف شما

khokhan
سه شنبه 03 بهمن 1391, 16:29 عصر
با سلام و تشکز آموزش

نمونه ایجاد فرم در کلاس رو دیدم ممنون مشکل اینجاست

اگر فرممون در کلاس ایجاد بشه و بعد بخواهیم کنترلهامون رو به اون اضافه کنیم چطور میتونیم

یا اینکه از اون فرم بخواهیم چند بار استفاده کنیم و هر بار هم کنترلهای اون متفاوت باشه چگونه اون رو میتونیم فرا خوانی کنیم

با سپاس از لطف شما

باسلام

دوست عزیز
با این شیوه فقط می تونی فرمی رو که قبلا ساختی در پروژه ات فراخوانی کنی

اینکه فرم روتغییر بدی وکنترلهاشو عوض کنی بعید به نظر می رسه وهر بار که خواستین تغییراتی در فرم بدین باید برگردین

به پروژ ایجاد همون dll

راه حل دوم اینه که یک dll از نوع کامپوننت تولید کنی واز محل tool box به پروژه هاتون اضافه کنین

در این صورت هم فقط کنترلها رو می تونین بکار ببرین

البته بهتره از اساتید محترم هم در این زمینه سوال کنین :لبخند:

Shahram_12
سه شنبه 03 بهمن 1391, 19:57 عصر
از لطفت برای پاسخ متشکرم

اما سوال دیگه (امیدورام پررویی منو ببخشی) من براس ساخت فرم از یک کلاس استفاده میکنم که جلوه هایی به فرم میده

برای بار اول که اون رو فراخوانی میکنم در فرم اولم مشکلی نیست اما در فرم دومم که میخوام اون کلاس رو فرا خوانی کنم اجرا نمیشه

khokhan
سه شنبه 03 بهمن 1391, 20:56 عصر
از لطفت برای پاسخ متشکرم

اما سوال دیگه (امیدورام پررویی منو ببخشی) من براس ساخت فرم از یک کلاس استفاده میکنم که جلوه هایی به فرم میده

برای بار اول که اون رو فراخوانی میکنم در فرم اولم مشکلی نیست اما در فرم دومم که میخوام اون کلاس رو فرا خوانی کنم اجرا نمیشه

اینطوری که نمی شه بایستی نمونه برنامه یا خود کلاس روبذاری تا ببینیم

samadblaj
چهارشنبه 04 بهمن 1391, 10:28 صبح
اینطوری که نمی شه بایستی نمونه برنامه یا خود کلاس روبذاری تا ببینیم

سلام ببخشید میشه بگیر چجور فرم رو dll کردید؟؟؟

c-sharp_South
چهارشنبه 19 تیر 1392, 14:06 عصر
سلام. چطوری فرم اولی به صورت dll در اومده که وقتی توی پروژه دومی میگیم diba. خودش diba1 رو میاره ؟؟؟

khokhan
چهارشنبه 19 تیر 1392, 14:39 عصر
سلام. چطوری فرم اولی به صورت dll در اومده که وقتی توی پروژه دومی میگیم diba. خودش diba1 رو میاره ؟؟؟
خیلی ساده است یه پروژه معمولی ایجاد کن طراحی فرم رو که تموم کردی و همه چیز مطابق میلتون بود
خروجی پروژه رو در پراپرتی پروژه به class library تغییر بدین تا به جای exe یه دونه dll در داخل پوشه debug پروژه تحویلتون بده همین تموم شد :لبخند:
بعدا می تونین از اون dll در سایر پروژه هاتون استفاده کنین
اینطوری

MehdiElexal
پنج شنبه 07 فروردین 1393, 02:34 صبح
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently.
این مشکل از bgw.RunWorkerAsync();
هست !
چرا ؟