PDA

View Full Version : سوال: BackGround Worker



papeli_83
جمعه 06 مرداد 1391, 17:20 عصر
با سلام

من میخوام با بک گراند ورکر کار کنم
ولی تو سایت برنامه نویس توضیح کاملی ازش نبود (تماما بصورت نمونه پروژه است و برای من که با کارایی و event هاش آشنا نیستم گنگ بود )

از دوستان خواهش میکنم تا آموزشی از این ابزار بزارن

با تشکر

the king
جمعه 06 مرداد 1391, 18:37 عصر
با سلام

من میخوام با بک گراند ورکر کار کنم
ولی تو سایت برنامه نویس توضیح کاملی ازش نبود (تماما بصورت نمونه پروژه است و برای من که با کارایی و event هاش آشنا نیستم گنگ بود )

از دوستان خواهش میکنم تا آموزشی از این ابزار بزارن

با تشکر

وقتی یک نمونه BackgroundWorker رو روی فرم قرار دادید اول دو تا مشخصه هایش را تنظیم کنید. WorkerReportsProgress رو اگر True کنید
می تونه در حین عملیاتی که داخل Thread جداگانه انجام میده به Thread اصلی و فرم گزارش بده که الان در چه مرحله ای از عملیاته.
اگر می خواهید روی فرم در حین عملیات چیزی مثل ProgressBar که مربوط به اون پردازش پشت پرده است نشون بدید True اش کنید.
مشخصه WorkerSupportsCancellation هم برای مواردی است که بشه اون عملیات پشت پرده رو نیمه کاره Cancel کرد.
اگر می خواهید فرضا دکمه ای روی فرم قرار بدهید که با فشار دادنش پردازش پشت پرده Cancel بشه، این مشخصه WorkerSupportsCancellation
رو True کنید.

در مرحله بعد بروید سراغ رخداد هایش. یعنی در اون پنجره Properties روی آیکون Events کلیک کنید. لابد می دانید که اگر روی هر رخدادی دوبار کلیک کنید
برای کد نویسی متد اش ساخته میشه.

رخداد DoWork کل عملیاتی است که باید داخل اون Thread انجام بشه. هر چی کد که لازمه پشت پرده انجام بشه رو اونجا می نویسید. فقط
فراموش نکنید که این Thread مجزا است و نباید به فرم و کنترل های رویش کاری داشته باشه. اگر می خواهید در این رخداد به چیزی روی فرم
دست بزنید، باید داخل ProgressChanged انجام اش بدید که بعدا توضیح می دهم.

داخل این کد هر جا که پیشرفتی در عملیات داشتید و خواستید گزارش بدهید با ReportProgress گزارش می دهید که چقدر
پیشرفت انجام شده، فرضا 20 درصد :

backgroundWorker1.ReportProgress(20);


اگر می خواهید پردازش قابل Cancel کردن باشه، حتما در داخل کد این رخداد مشخص کنید که اگر مقدار CancellationPending
برابر True است ازش بیاد بیرون. مشخصه CancellationPending وقتی True میشه که قراره پردازش متوقف بشه، می توانید تصمیم بگیرید
که اعتنا بکنید یا نکنید. کد شما ممکنه گوش نکنه و بیرون نیاد.
مثلا :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (long n = 0; n < 10000000000; n++)
{
if (backgroundWorker1.CancellationPending)
{
return;
}
.
.
.
}
}


رخداد ProgressChanged وقتی اجرا میشه که بخواهید به فرم گزارش بدهید که الان در چه مرحله ای از عملیات هستید. پارامتر e.ProgressPercentage
مقدار عددی درصد پیشرفت عملیاته، فرضا 20 یعنی 20 درصد عملیات انجام شده. مجبور نیستید که این رخداد رو مدیریت کنید، اختیاریه، اما اگر
می خواهید در حین عملیات با فرم در ارتباط باشه به این رخداد نیاز دارید.
مثلا :

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}


رخداد RunWorkerCompleted وفتی اتفاق می افته که پردازش Thread شما تموم شده یا Cancel اش کرده اید و الان دیگه
در حال اجرا نیست. در این رخداد دسترسی کامل به فرم را دارید چون Thread اصلی اجرایش می کنه. هر کاری که لازمه
بعد از اتمام پردازش یا کنسل شدنش انجام بشه رو اینجا بنویسید.
مثلا :

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("The operation aborted by user.");
}
else
{
MessageBox.Show("The operation finised successfully.");
}
}


حالا هر جا که لازمه عملیات پشت پرده شروع بشه، به BackgroundWorker فرمان RunWorkerAsync را بدهید، اینکار باعث توقف کد شما
نمی شود چون پردازش در Thread دیگری انجام خواهد شد. هر کد یا کد هایی که در ادامه این فرمان بنویسید بدون مکث اجرا میشه.
مثلا :

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}


و هر جا هم که لازمه پردازش Cancel بشه بهش فرمان CancelAsync رو بدهید. فقط دقت کنید که خودتون باید در کد های DoWork مراقب
مقدار CancellationPending باشید که اگر True شد ازش بیاید بیرون، وگرنه CancelAsync یک درخواسته، می توانید بهش پاسخ ندهید
و پردازش Cancel نشه.
مثلا :

private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}


اساس کار BackgroundWorker همینه که نوشتم.

papeli_83
جمعه 06 مرداد 1391, 19:31 عصر
با سلام
از شما واقعا ممنونم کمک بزرگی کردید ( دیدم تنها فشار دادن دکمه تشکر کافی نیست! )

aminaltavista
پنج شنبه 19 مرداد 1391, 10:34 صبح
هر چی کد که لازمه پشت پرده انجام بشه رو اونجا می نویسید. فقط
فراموش نکنید که این Thread مجزا است و نباید به فرم و کنترل های رویش کاری داشته باشه. اگر می خواهید در این رخداد به چیزی روی فرم
دست بزنید، باید داخل ProgressChanged انجام اش بدید که بعدا توضیح می دهم.


دوست عزیز از این که مفصل توضیح دادی سپاسگذارم!

فقط تو این مورد بنده رو راهنمایی کنید :
همون طور که تو قسمت پست های #C گفتم وشما بنده رو به این جا لینک دادید دستورات سیو رو تو کنترل تامیر مینوشتم به این علت که با روند کارم با progress نشون داده بشه ! حالا این جا شما عرض کردید که کل دستوراتی که میخواید پشت پرده اجرا بشه باید تو رویداد DoWork باشه ! از اون طرف هم گفتید که هیچ ربطی به کنترلهای روی فرم نداره و برای این ، باید تو رویداد ProgressChanged دستور بنویسید.
این جا من گیج شدم که آیا باید دستورات ذخیره رو تو رویداد DoWork بنویسم یا در رویداد progress change که روند عملیات در حال انجام نشون داده بشه!
خواهش میکنم بنده رو راهنمایی کنید.با تشکر :تشویق:

the king
پنج شنبه 19 مرداد 1391, 15:45 عصر
دوست عزیز از این که مفصل توضیح دادی سپاسگذارم!

فقط تو این مورد بنده رو راهنمایی کنید :
همون طور که تو قسمت پست های #C گفتم وشما بنده رو به این جا لینک دادید دستورات سیو رو تو کنترل تامیر مینوشتم به این علت که با روند کارم با progress نشون داده بشه ! حالا این جا شما عرض کردید که کل دستوراتی که میخواید پشت پرده اجرا بشه باید تو رویداد DoWork باشه ! از اون طرف هم گفتید که هیچ ربطی به کنترلهای روی فرم نداره و برای این ، باید تو رویداد ProgressChanged دستور بنویسید.
این جا من گیج شدم که آیا باید دستورات ذخیره رو تو رویداد DoWork بنویسم یا در رویداد progress change که روند عملیات در حال انجام نشون داده بشه!
خواهش میکنم بنده رو راهنمایی کنید.با تشکر :تشویق:

رخداد DoWork برای فرم یک غریبه است، اگر می خواهید اطلاعاتی که فرضا روی فرم ئه رو در اختیارش قرار بدهید از متغیر عمومی استفاده می کنید، فرضا نمی توانید
مستقیما TextBox1.Text رو در اختیار DoWork قرار دهید اما می توانید متغیر عمومی t1 را این وسط واسطه کنید :

Private t1 As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
t1 = TextBox1.Text
BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
MessageBox.Show(t1)
End Sub


اگه عملیات Save شدن ذاتا یک تکه ای است و نمی توانید بخش بندی اش کنید همه اش باید در DoWork انجام بشه. اگر لازمه که در مراحل Save شدن مقداری بکار بره
که الان روی فرم در یک کنترل ئه ، همون موقع که دکمه رو فشار می دهید داخل یک متغیر کپی اش کنید تا Thread فرعی از اون متغیر مقدار رو بخونه.
اما اغلب اوقات Save شدن تکه تکه است، فرضا شما یک لیست دارید که باید ذخیره بشه، می توانید یک حلقه در DoWork داشته باشید که آیتم های داخل لیست
رو یکی یکی ذخیره کنه و هر بار که آیتمی رو ذخیره کرد با ReportProgress گزارش پیشرفت رو بده، اونوقت در ProgressChanged هر کاری که خواستید برای
نمایش پیشرفت کار انجام بدهید.

hale1234
چهارشنبه 04 دی 1392, 23:13 عصر
سلام به همه
من یه فرم دارم که روش یه نقشه است فرم اولم هست حالا بارگذاری این نقشه طول می کشه داخل لود فرمم تنها کدی که هست همین بارگذاری نقشه است خوب یه مقدار طول میکشه
میشه با یه پروگرس بار توی یک صفجه ی دیگه مثل فرم دو تا زمانی که داره نقشه بارگذاری میشه به کاربر نشون بدیم برنامه داره کار می کنه
درباره ی BackgroundWorker خوندم ولی درست نفهمیدم چی کار باید بکنم تا این پروگرس بار تو فرم دو نشون داده شه در جالیکه فرم یکم داره بارگذاری می شه

aminaltavista
پنج شنبه 05 دی 1392, 18:44 عصر
سلام به همه
من یه فرم دارم که روش یه نقشه است فرم اولم هست حالا بارگذاری این نقشه طول می کشه داخل لود فرمم تنها کدی که هست همین بارگذاری نقشه است خوب یه مقدار طول میکشه
میشه با یه پروگرس بار توی یک صفجه ی دیگه مثل فرم دو تا زمانی که داره نقشه بارگذاری میشه به کاربر نشون بدیم برنامه داره کار می کنه
درباره ی BackgroundWorker خوندم ولی درست نفهمیدم چی کار باید بکنم تا این پروگرس بار تو فرم دو نشون داده شه در جالیکه فرم یکم داره بارگذاری می شه

سلام

شناس آوریدی که جوابتون رو میدم این تاپیک برا خیلی وقت پیشه!:متعجب::متعجب:
ببین سه تا متد هست:
1(Do Work)- تو این متد کدهایی که میخوای انجام بشه رو مینویسی
2(ProgressChanged)- تو این متد گذارش رو نشون میدی
3(RunWorkerCompleted)-تو این متد بعد از اینکه فرآیند تموم شد عملیات مورد نظر رو انجام میدی
حتما به این لینک برو و توضیحات رو بخون
http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
موفق باشی.