ورود

نسخه کامل مشاهده نسخه کامل : مختصری درباره BackgroundWorker



B O L O T
02-08-2007, 14:13
BackgroundWorker محسوس تر و بصری تر کردن کلاس thread است.یک پروسه زمان بر را به آن میدهیم و BackgroundWorker آن را اصطلاحا در پشت (رابط کاربری و کاربر شما) تا پایان انجام میدهد در حالی که کاربر میتواند در طول این مدت پروسهای دیگر خود را انجام دهد.

BackgroundWorker1.RunWorkerAsync(100): این متد رویداد DoWork را صدا میزند پارامتر آن اختیاری و از نوع object است که در رویداد DoWork توسط متد e.Argument قابل بازیابی است.


BackgroundWorker1.DoWork: کدهای مربوط به پروسه خود را (مثل لود تعداد زیادی رکورد) در این رویداد قراردهید.


BackgroundWorker1.RunWorkerCompleted: وقتی کل پروسه پایان پذیرفت این رویداد صدا زده میشود.

backgroundWorker1.IsBusy: مادامیکه پروسه در حال انجام است و رویداد RunWorkerCompleted صدا زده نشده این خصوصیت مقدار True دارد


BackgroundWorker.ReportProgress(int32): برای استفاده از این متد ابتدا خصوصیت WorkerReportsProgress رابرابر true قراردهید.
این متد رویداد BackgroundWorker.ProgressChanged را صدا میزند و پارامتر خود را در متد e. ProgressPercentage رویداد فوق تحویل میدهد.


BackgroundWorker.ProgressChanged: به راحتی میتوانید در این رویداد پروگرس بار خود را مقداردهی کنید. و کاربر را از روند کار آگاه کنید.


BackgroundWorker.CancelAsync: برای استفاده از این متد ابتدا خصوصیت WorkerSupportsCancellation رابرابر true قراردهید.
این متد باعث کنسل شدن کل پروسه میشود. و خصوصیت BackgroundWorker.CancellationPending را True میکند البته مشخص است که خروجی پروسه تا فراخوانی این متد در اختیار کاربر است.


BackgroundWorker.CancellationPending: بهتر است در طول پروسه مقدار این خصوصیت مرتبا چک شود.

Shahrdar
02-08-2007, 19:09
سلام
ممنون از آموزشه خوبت

من يه مشکل دارم تويه cancel کردن من اينکارو به سرته زير انجام ميدم
(اينم بگم که workersupportscancellation = true هست)

برايه شروع


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برايه cancel کردن


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولی جواب هميشه true ميشه

اگه کمک کنی ممنون ميشم

hamidreza_buddy
05-08-2007, 16:01
باید توی پروسه ای که در حال اجرا هست چک کنی که آیا bakground.CancellationPending مقدارش true شده یا نه.
چون بعد از اجرای CancelWork() این مقدار true می شود و ما باید پروسه مان را به پایان برسانیم. مخصوصاً اگر پروسمون یک حلقۀ بینهایت داشته باشه. وگرنه تا آخر اجرا میشه و هیچ راهی برای متوقف کردنش نیست.

در ضمن یه چیز جالب هم در این باره تغییر مشخصات فرم (یا در کل داده های یک ریسمان دیگر) هست. چون این دو در دو ریسمان متفاوت هستند این کار به صورت مستقیم امکان پذیر نیست. مثلاً برای تغییر اندازۀ فرم (Size) اگر به صورت مستقیم در پروسه عمل کنیم یک Exception رخ می دهد.

برای مثال من خودم می بایست در این متد ScrollSize یک فرم رو تغییر می دادم. ولی اگه مستقیم می نوشتم که مثل

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یک exception رخ می داد.
برای حل این مشکل باید این کارو می کردم:
ابتدا یک delegate ایجاد کنم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد توی فرمم یک عضو از این نوع ساختم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

بعد اونو تو سازنده مقداردهی کردن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و تابعی با این نام در فرم ایجاد کردم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حال هر وقت نیاز به تغییر دادن ScrollSize فرم در پروسه بود اینگونه عمل می کردیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

آخیش تموم شد!

B O L O T
05-08-2007, 22:26
ممنون کارت عالیه .

rahgouzar
21-12-2007, 23:42
سلام خيلي ممنون از پستتون
ميخواستم بدونم چه طور ميشه مقداري رو كه از انجام يك پروسه در backgroundworker بدست آورديم به يك textbox در همون فرم منتقل كنيم
با تشكر

lahij.ir
22-08-2010, 00:09
سلام خيلي ممنون از پستتون
ميخواستم بدونم چه طور ميشه مقداري رو كه از انجام يك پروسه در backgroundworker بدست آورديم به يك textbox در همون فرم منتقل كنيم
با تشكر
سلام سوال منم همینه ، مستقیم نمیتونم یه مقدار بدم به شی روی فرمم چی کار کنم ؟:41:

without_all
23-08-2010, 22:07
سلام سوال منم همینه ، مستقیم نمیتونم یه مقدار بدم به شی روی فرمم چی کار کنم ؟:41:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدتابع به رنگ آبی رو داخل backgroundWorker1_DoWork فراخانی میکنید .