آموزش کار با BackgroundWorker
#1
Note 
سلام این آموزش همراه با یک مثال انجام میشود.
(توجه : در بهینه نبودن این مثال شک نداشته باشید چون فی البداهه و صرف آموزش نوشته شده است)

مثال - میخواهیم تمامی فایلهای موجود در پوشه ی ویندوز را توسط یک thread پشت زمینه (مستقل از UI Thread) در یک لیست باکس نمایش دهیم.

بلافاصله و بدون مقدمه؛ ابتدا یک آبجکت از نوع BackgroundWorker بسازید و در زمان کلیک شدن یک دکمه مقادیر آن را به شکل زیر تغییر دهید :
کد php:
BackgroundWorker worker = new BackgroundWorker();
 
private 
void button1_Click(object senderEventArgs 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 در تیکه کد قبلی تحریک میشود :
کد php:
void worker_DoWork(object senderDoWorkEventArgs 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 فایل پیدا شده انجام شود) یک گزارش از میزان پیشرفت همراه با پارامترهای شماره فایل و نام آن میفرستیم.
و در نهایت برای منعکس کردن پیشرفتهای لحظه ای و اختصاص آنها به لیست باکس مینویسیم:
کد php:
void worker_ProgressChanged(object senderProgressChangedEventArgs e)
{
    
listBox1.Items.Add(e.ProgressPercentage.ToString() + " : " e.UserState.ToString());


توجه کنید که در کد بالا مقدار e.UserState همان آبجکتی است که در زمان DoWork ارسال کردید.

منبع:barnamenevis.org

پاسخ
ایجاد موضوع جدید   پاسخ به موضوع  

موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  سوال نوشتن برنامه ای برای گرفتن معدل دانش اموزان mansoureh 4 811 12-06-2015 ساعت 23:52
آخرین ارسال: mansoureh
Note کتاب آموزش Parse کردن یک خبر خوان وردپرسی برای ویندوزفون The Arrow 0 969 23-04-2015 ساعت 09:24
آخرین ارسال: The Arrow
Note کتاب آموزشی SQLite ویندوزفون The Arrow 1 1,109 07-12-2014 ساعت 09:59
آخرین ارسال: Ali Developer
Note فصل دوم آموزش برنامه نویسی ویندوزفون - ویرایش یکم The Arrow 2 541 09-10-2014 ساعت 12:51
آخرین ارسال: rockstar
Note فصل دوم آموزش برنامه نویسی ویندوزفون The Arrow 0 390 06-10-2014 ساعت 01:46
آخرین ارسال: The Arrow
Note آموزش کامل سی شارپ (ویدئو) xMAN 2 678 02-10-2014 ساعت 12:50
آخرین ارسال: xMAN
Note آموزش برنامه نویسی ویندوز فون به همراه کتاب الکترونیکی The Arrow 0 486 02-10-2014 ساعت 12:22
آخرین ارسال: The Arrow
Note کتاب آموزش قدم به قدم سی شارپ THE KNIGHT 0 427 27-01-2014 ساعت 19:28
آخرین ارسال: THE KNIGHT
Note آموزش سی شارپ - برعکس کردن یک آرایه xMAN 0 300 26-01-2014 ساعت 12:09
آخرین ارسال: xMAN
Note آموزش سی شارپ -ایجاد و تخصیص ToolTip در زمان اجرا xMAN 0 343 26-01-2014 ساعت 12:07
آخرین ارسال: xMAN

کاربرانِ درحال بازدید از این موضوع:   1 مهمان