سلام این آموزش همراه با یک مثال انجام میشود.
(توجه : در بهینه نبودن این مثال شک نداشته باشید چون فی البداهه و صرف آموزش نوشته شده است)
مثال - میخواهیم تمامی فایلهای موجود در پوشه ی ویندوز را توسط یک thread پشت زمینه (مستقل از UI Thread) در یک لیست باکس نمایش دهیم.
بلافاصله و بدون مقدمه؛ ابتدا یک آبجکت از نوع BackgroundWorker بسازید و در زمان کلیک شدن یک دکمه مقادیر آن را به شکل زیر تغییر دهید :
BackgroundWorker worker = new BackgroundWorker();
private void button1_Click(object sender, EventArgs e)
{
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged );
worker.RunWorkerAsync(new DirectoryInfo(@"C:\Windows"));
}
خط آبی شده حاکی از آن است که worker میتواند در زمان اجرا میزان پیشرفت خود را گزارش کند(که باعث توانایی کار کردن با عناصر UI بصورت مستقیم و بدون استفاده از delegate میشود)
سپس ایونت هندلرها رو تخصیص داده
و در خط آخر نیز دستور اجرای آسنکرون اون رو با یک پارامتر ورودی را صادر کردیم.
کار زمانبری که میخواهیم در پشت زمینه انجام شود را در رویداد DoWork مینویسیم و این همان رویدادی ست که با دستور worker.RunWorkerAsync در تیکه کد قبلی تحریک میشود :
void worker_DoWork(object sender, DoWorkEventArgs e)
{
DirectoryInfo primaryDir = e.Argument as DirectoryInfo;
int i = 0;
foreach (DirectoryInfo dir in primaryDir.GetDirectories())
{
foreach (FileInfo file in dir.GetFiles())
{
worker.ReportProgress(i++, file.FullName);
}
}
}
همانطور که مشاهده کردید در خط اول متود بالا پارامتر ورودی را در قالب یک DirectoryInfo در آوردیم که بتوانیم از آن استفاده کنیم.
و به ازای هر فایل شناخته شده (البته در عمل : بهتر است اینکار مثلا به ازای هر 100 فایل پیدا شده انجام شود) یک گزارش از میزان پیشرفت همراه با پارامترهای شماره فایل و نام آن میفرستیم.
و در نهایت برای منعکس کردن پیشرفتهای لحظه ای و اختصاص آنها به لیست باکس مینویسیم:
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Add(e.ProgressPercentage.ToString() + " : " + e.UserState.ToString());
}
توجه کنید که در کد بالا مقدار e.UserState همان آبجکتی است که در زمان DoWork ارسال کردید.
منبع:barnamenevis.org