الأربعاء، 28 يونيو 2017

الطريقة الصحيحة لاستخدام BackgroundWorker فى vb.net


كثير من المبرمجين لا يعرفون الطريقة الصحيحة للتعامل  مع backgroundWorker سأقوم بشرح هذا الامر مع الاستعانة بمثال
قم بعمل مشروع جديد بالفيجوال بيسك واضف اليه backgroundWorker وزرين و2 ليبل 

فى حدث تحميل الفورم

1.  Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
2.      Button1.Text = "Start"
3.      Button2.Text = "Cancel"
4.      Label1.Text = ""
5.      Label2.Text = ""
6.  End Sub

فى حدث الضغط على زر button1
Button1.Enabled = False
Button2.Enabled = True
    هذه الخصائص يتم وضعها true فى وقت التصميم قبل استدعاء RunWorkerAsync
   للتأكد ان backgroundWorker يدعم Cancellation and reporting progress
BackgroundWorker1.WorkerSupportsCancellation = True
BackgroundWorker1.WorkerReportsProgress = True
8.     استدع هذه الطريقة للبدء    
BackgroundWorker1.RunWorkerAsync()


فى حدث الضغط على button2

 للايقاف عليك باستدعاء هذه الطريقة   
Button2.Enabled = False
BackgroundWorker1.CancelAsync()


فى حدث dowork
Const Max As Integer = 1000
For i = 1 To Max
 تم وضع sleep لمحاكاة الوقت
Threading.Thread.Sleep(100)
تقرير التقدم
BackgroundWorker1.ReportProgress(CInt(100 * i / Max), "Running..." & i.ToString)
التحقق من هل قام المستخدم بالايقاف وفى حالة الايقاف الخروج من loop
If BackgroundWorker1.CancellationPending Then
BackgroundWorker1.ReportProgress(CInt(100 * i / Max), "Cancelling...")
Exit For
End If
Next
اى اكواد خاصة بالتنظيف توضع هنا للتأكد من اغلاق اى مصدر قبل انهاء الدالة
وضع e.cancel = true لاخبار runworkercopleted انك قمت بالانهاء
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
BackgroundWorker1.ReportProgress(100, "Cancelled.")
End If


فى حدث ProgressChanged

    هذا الحدث يتم اطلاقه عندما نقوم باستدعاء الدالة    reportprogress من داخل حدث dowork
هنا يتم وضع التغييرات التى تطرأ واسنادها لل labels
   Label1.Text = CType(e.UserState, String)
   Label2.Text = e.ProgressPercentage.ToString & "% complete."


فى حدث RunWorkerCompleted
هذا الحدث يتم اطلاقه عندما يتم انهاء backgroundworker  باى طريقة حتى لو بالضغط على زر الالغاءاو لاى خطأ
   If e.Error IsNot Nothing Then
    هل انتهى backgroundWORKER بخطأ
      MessageBox.Show(e.Error.Message)
      Label1.Text = "Error occurred!"
   ElseIf e.Cancelled Then
    فى حالة اغلاقه
      MessageBox.Show("Task cancelled!")
      Label1.Text = "Task Cancelled!"
    Else
 فى حالة الانتهاء الطبيعى
       MessageBox.Show("Task completed!")
       Label1.Text = "Error completed!"
    End If
       Button1.Enabled = True
       Button2.Enabled = False
    End Sub









هناك تعليق واحد:

  1. The Best No Deposit Casinos - DrMCD
    The Best No Deposit Casinos · 광명 출장마사지 1. BetMGM Casino - $50 충청남도 출장샵 No Deposit Bonus · 동두천 출장안마 2. 888 Casino - $50 Free $25 No Deposit Bonus · 3. 논산 출장안마 Caesars Casino 남원 출장마사지 - $50 Free

    ردحذف

جميع الحقوق محفوظة © 2019 الحقيبة البرمجية لمبرمجى VB.NET