|
พอดีมีคำถามเข้ามาเกี่ยวกับ BackgroundWorker เข้ามา แอดมินจะสรุปสั้นๆ BackgroundWorker นั้นมันเป็นคลาส ที่ช่วยให้เราสามารถแยกคำสั่งปฏิบัติการ (Operation) ไปบนเธรด (Thread) ใหม่ได้ เอ้า!!! เดี๋ยวจะงง หากใครที่เคยใช้ ProgressBar มา คงจะสังเกตเห็นว่าเราจะไม่สามารถขยับฟอร์มไปไหนได้เลย ก็เพราะว่ามันมีงานค้างอยู่ต้องทำให้เสร็จเรียบร้อยเสียก่อน หากจะให้อธิบายเรื่อง Thread มันเป็นเรื่องยาวมาก แอดมินอยากให้ทุกๆท่านได้นำโค้ดไปลองทดสอบดู เมื่อเห็นผลลัพธ์ ก็คงจะเข้าใจได้ไม่ยาก และนำเอาผลการปฏิบัติไปช่วยอ้างอิงเพื่อตีความหมายในหลักการทางทฤษฎี ซึ่งในตัว VB.NET มันมี Control ที่ชื่อว่า BackgroundWorker มาคอยช่วยจัดการเรื่อง Thread ให้เป็นที่เรียบร้อยแล้ว UHU ...
Design Time
BackgroundWorker จะมี Events ที่สำคัญอยู่ 3 ตัว คือ
- Dowork ทำหน้าที่รันการปฏิบัติการแบบอยู่เบื้องหลัง หรือ Background Process
- ProgressChanged ทำหน้าที่รายงานความคืบหน้าของการปฏิบัติการที่ทำอยู่
- RunWorkerCompleted จะทำงานเมื่องานที่ทำอยู่นั้นเสร็จสิ้นสมบูรณ์
ทดสอบการรันแบบธรรมดา
ทดสอบการรันแบบใช้ BackgroundWorker
มาดูโค้ดกันเถอะ ...
- #Region "ABOUT"
- ' / --------------------------------------------------------------------------
- ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
- ' / eMail : thongkorn@hotmail.com
- ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
- ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
- ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
- ' / Purpose: How to use The BackgrounderWorker.
- ' / Microsoft Visual Basic .NET (2010)
- ' /
- ' / This is open source code under @CopyLeft by Thongkorn/Common Tubtimkrob.
- ' / You can modify and/or distribute without to inform the developer.
- ' / --------------------------------------------------------------------------
- #End Region
- Public Class frmBackgroundWorker
- Private Sub frmBackgroundWorker_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- TextBox1.Text = 100
- TextBox1.MaxLength = 3
- '// Initialized
- With BackgroundWorker1
- .WorkerReportsProgress = True
- .WorkerSupportsCancellation = True
- End With
- '//
- Control.CheckForIllegalCrossThreadCalls = False
- End Sub
- '// Background Worker Process
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
- If Trim(TextBox1.Text) = "" Then Return
- '//
- BackgroundWorker1.RunWorkerAsync()
- End Sub
- '// BackgroundWorker - Events DoWork
- Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- For i = 1 To 100
- TextBox1.Text = i
- BackgroundWorker1.ReportProgress(i)
- Threading.Thread.Sleep(100)
- lblProgress.Text = ProgressBar1.Value & "%"
- Next
- End Sub
- '// When change occurs.
- Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
- Me.ProgressBar1.Value = e.ProgressPercentage
- End Sub
- '// When finished.
- Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- MessageBox.Show("Done Complete.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End Sub
- '// Normal Process
- Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
- If Trim(TextBox1.Text) = "" Then Return
- '//
- Dim Max As Integer = 100
- For i = 1 To Max
- TextBox1.Text = i
- lblProgress.Text = i.ToString & "%"
- ProgressBar1.Value = (100 / Max) * i
- Threading.Thread.Sleep(100)
- Next
- End Sub
- ' / --------------------------------------------------------------------------
- ' / Get numeric only.
- Function CheckDigitOnly(ByVal index As Integer) As Boolean
- Select Case index
- Case 48 To 57 ' 0 - 9
- CheckDigitOnly = False
- Case 8, 13 ' Backspace = 8, Enter = 13
- CheckDigitOnly = False
- Case Else
- CheckDigitOnly = True
- End Select
- End Function
- Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
- If e.KeyChar = Chr(13) Then
- e.Handled = True
- Call Button1_Click(sender, e)
- Else
- e.Handled = CheckDigitOnly(Asc(e.KeyChar))
- End If
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวนโหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|