PDA

View Full Version : آشنایی با کامپوننت BackgroundWorker



tooraj_azizi_1035
جمعه 26 خرداد 1391, 18:56 عصر
سلام

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

نگاهی کلی بر کامپوننت BackgroundWorker

عملیات رایج بسیاری وجود دارند که می توانند زمان زیادی برای اجرا مصرف کنند. برای مثال:



دانلود عکس ها
فراخوانی یک Web Service
دانلود و آپلود فایل ها
محاسبات محلی پیچیده
Database transactions
دستیابی محلی به دیسک، به خاطر سرعت پایینش نسبت به حافظه اصلی

عملیاتی از این دست می توانند باعث شوند تا واسط کاربری شما در هنگامی که این عملیات در حال اجرایند به حالت تعلیق در بیایند.

زمانی که شما یک UI پاسخگو نیاز دارید و با تاخیرهای طولانی در اجرای این عملیات مواجه هستید BackgroundWorker راه حل مناسبی برای رفع این مشکل فراهم می آورد.

BackgroundWorker به شما امکان می دهد تا عملیات زمان بر را ناهمگام (asynchronously ) (یعنی در پس زمینه) روی نخی به جز نخ UI اصلی برنامه تان اجرا کنید .

برای استفاده از BackgroundWorker شما به سادگی به این کامپوننت متد زمان بر را برای اجرا در پس زمینه به معرفی می کنید و سپس متد RunWorkerAsync را صدا می زنید.
نخی را که از داخل آن متد RunWorkerAsync صدا زده می شود به شکل نرمال اجرایش ادامه پیدا می کند در حالی که متد کارگر (Worker) همزمان به شکل ناهمگام اجرا می شود. هنگامی که متد کارش را تمام می کند BackgroundWorker به نخ فراخواننده با Fire کردن رویداد RunWorkerCompleted اتمام کار را گزارش می دهد که به شکل اختیاری حاوی نتایج عملیات است.
کامپوننت BackgroundWorker در تب Components جعبه ابزار می باشد. برای افزودن BackgroundWorker به فرمتان یک کامپوننت BackgroundWorker به فرمتان درگ کنید. BackgroundWorker در Component Tray قرار می گیرد و خصوصیاتش در پنجره Properties نمایش داده می شود.

برای شروع عملیات ناهمگامتان از متد RunWorkerAsync استفاده کنید. RunWorkerAsync به شکل اختیاری یک پارامتر از نوع object می گیرد که می تواند برای ارسال آرگومان ها به Worker thread شما ارسال شود. کلاس BackgroundWorker رویداد DoWork را در معرض استفاده قرار می دهد که Worker thread شما به آن از طریق یک DoWork Event Handler می پیوندد.


DoWork (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork.aspx ) event handler پارامتری از نوع DoWorkEventArgs (http://msdn.microsoft.com/en-us/library/system.componentmodel.doworkeventargs.aspx) می گیرد که دارای خاصیتی به نام Argument (http://msdn.microsoft.com/en-us/library/system.componentmodel.doworkeventargs.argument.asp x) است. این خاصیت پارامتر را از RunWorkerAsync دریافت می کند و می تواند به متد کارگر شما که در DoWork (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork.aspx ) event handler صدا شده خواهد شد ارسال شود. مثال زیر نشان می دهد که چطور یک نتیجه از یک متد کارگر به نام ComputeFibonacci را می توان انتساب داد.


// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender,
DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;

// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}


این کد بخشی از یک مثال بزرگ است که می توانید در اینجا (http://msdn.microsoft.com/en-us/library/waw3xexc.aspx)نمونه کاملش را مشاهده کنید.