Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 107,936

HOME > บทความจากสมาชิก > Windows Form App : ทำให้หน้าจอไม่ค้างในขณะทำงานด้วย BackgroundWorker (VB.Net,C#)



 
Clound SSD Virtual Server

Windows Form App : ทำให้หน้าจอไม่ค้างในขณะทำงานด้วย BackgroundWorker (VB.Net,C#)

Windows Form App : ทำให้หน้าจอไม่ค้างในขณะทำงานด้วย BackgroundWorker (VB.Net,C#) ในการใช้งาน Background Process เป็นเทคนิคขั้น Advanced ของการเขียนโปรแกรม เพราะปกติแล้วการเขียนโปรแกรมบน Windows Form Application ทั่ว ๆ ไป ในขณะที่โปรแกรมกำลังทำงานด้วย Process ที่ทำงานนาน ๆ หนัก ๆ เราจะสังเกตุว่าหน้าจอนั้นค้างหรือแฮ้งไปชั่วขณะ และจะต้องรอจนกว่าโปรแกรมทำงานเสร็จ หน้าจอถึงจะ Active ให้ใช้งานได้อีกครั้ง ไม่สามารถที่จะยกเลิก หรือ Cancel ตัว Process ได้ และในหลาย ๆ โปรเจคที่ผมมารับช่วงต่อ (เก็บบั๊ก 555+) โปรแกรมเมอร์เก่า ๆ ก็ไม่ได้นำ BackgroundWorker มาใช้งานหรือให้ความสำคัญเลย ผลลัพธ์ที่ได้คือ โปรแกรมทำงานนานมาก และ หน้าจอค้างไปเฉย ๆ ทางยูสเซอร์เองก็ไม่ค่อยชอบกับ Interface แบบนี้ซะเท่าไหร่ เพราะมันเป็นการบ่งบอกถึงความรู้ความสามารถประสบการณ์การเป็นมืออาชีพในการเขียนโปรแกรมของเราได้เลย ซึ่งปกติเมือ่ก่อนแล้วเราอาจจะต้องประกาศพวก Thread ขึ้นมาใช้งาน แต่ใน .Net รุ่นใหม่ ๆ มี Class ของ BackgroundWorker ให้เราเรียกใช้งานได้เลย แทบจะเรียกใช้ได้สะดวกมาก ๆ และผมก็ค่อนข้างที่จะชอบมันมากด้วยเช่นเดียวกัน

BackgroundWorker Syntax (C#)
        BackgroundWorker bgWorker = new BackgroundWorker();

        private void btnStart_Click(object sender, EventArgs e)
        {
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);

            bgWorker.RunWorkerAsync();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            bgWorker.CancelAsync();
        }

        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Do Work
        }

        // This event handler updates the progress.
        private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // Update Progress Status to UI
        }

        // This event handler deals with the results of the background operation.
        private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // Finish
        }
BackgroundWorker Syntax (VB.Net)
    Private WithEvents bgWorker As New BackgroundWorker

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        bgWorker.RunWorkerAsync()
    End Sub

    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        bgWorker.CancelAsync()
    End Sub

    Private Sub bgWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
        ' Do Work
    End Sub

    Private Sub bgWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
        ' Update Progress Status to UI
    End Sub

    Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
        ' Finish
    End Sub

คำอธิบาย ในการใช้งาน BackgroundWorker จะมีการ Delegate ตัว Method ขึ้นมา 3 ตัวคือ
- DoWork เป็น Method ที่เริ่มทำงาน BackgroundWorker ในรูปแบบของ Background Process เราไม่สามารถส่งออก UI ออกทาง Method นี้ได้ จะต้องไปใช้ ProgressChanged
- ProgressChanged เป็น Method สำหรับส่งออกหรือแสดงค่า UI ออกทางหน้าจอ ซึ่งในขณะที่ทำงานที่ DoWork สามารถส่งออก Result เพื่อ Call ProgressChanged ได้ทุกระยะ
- RunWorkerCompleted เป็น method เมื่อ BackgroundWorker ทำงานเสร็จสิ้น

ปกติแล้วการทำงานในรูปแบบของ Process เราจะไม่ทราบว่าจะต้องใช้เวลาทำงานซะเท่าไหร่ ฉะนั้นในส่วนของ ProgressChanged เราอาจจะใช้เป็นรุปภาพ หมุ่น ๆ หรือ Loading แทน หรือจะใช้เป็นแบบ Dialog ProgressBar ก็ได้








Example : การใช้ BackgroundWorker ทำงานเป็น Background Process ป้องกันหน้าจอค้าง

BackgroundWorker Background Process

ออกแบบหน้าจอดังรูป

Code (C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoProgressWorking
{
    public partial class Form1 : Form
    {

        BackgroundWorker bgWorker;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            // New BackgroundWorker
            bgWorker = new BackgroundWorker();
            bgWorker.WorkerReportsProgress = true;
            bgWorker.WorkerSupportsCancellation = true;
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);

            // Start the asynchronous operation.
            bgWorker.RunWorkerAsync();
            this.btnStart.Enabled = false;
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (bgWorker.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                bgWorker.CancelAsync();
            }
        }

        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        // This event handler updates the progress.
        private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.lblResult.Text = (e.ProgressPercentage.ToString() + "%");
        }

        // This event handler deals with the results of the background operation.
        private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                this.lblResult.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                this.lblResult.Text = "Error: " + e.Error.Message;
            }
            else
            {
                this.lblResult.Text = "Done!";
            }
            this.btnStart.Enabled = true;
            MessageBox.Show("Working Finished.");
        }

    }
}
Code (VB.Net)
Imports System.ComponentModel

Public Class Form1

    Private WithEvents bgWorker As BackgroundWorker
    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
    End Sub

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        ' New BackgroundWorker
        bgWorker = New BackgroundWorker
        bgWorker.WorkerReportsProgress = True
        bgWorker.WorkerSupportsCancellation = True

        ' Start the asynchronous operation.
        bgWorker.RunWorkerAsync()
        Me.btnStart.Enabled = False
    End Sub

    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        If bgWorker.WorkerSupportsCancellation = True Then
            ' Cancel the asynchronous operation.
            bgWorker.CancelAsync()
        End If
    End Sub

    Private Sub bgWorker_DoWork(sender As Object, e As DoWorkEventArgs) Handles bgWorker.DoWork
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
        Dim i As Integer

        For i = 1 To 10
            If (worker.CancellationPending = True) Then
                e.Cancel = True
                Exit For
            Else
                ' Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500)
                worker.ReportProgress(i * 10)
            End If
        Next
    End Sub

    Private Sub bgWorker_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
        Me.lblResult.Text = (e.ProgressPercentage.ToString() + "%")
    End Sub

    Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
        If e.Cancelled = True Then
            Me.lblResult.Text = "Canceled!"
        ElseIf e.Error IsNot Nothing Then
            Me.lblResult.Text = "Error: " & e.Error.Message
        Else
            Me.lblResult.Text = "Done!"
        End If
        Me.btnStart.Enabled = False
        MessageBox.Show("Working Finished.")
    End Sub

End Class

Screenshot

BackgroundWorker Background Process

ทดสอบการทำงาน

BackgroundWorker Background Process

แสดงสถานะการทำงาน ซึ่งในส่วนนี้จะไม่ใช้เป็นเปอร์เซ็นต์ก็ได้ อาจจะแสดงรุปภาพ หรืออื่น ๆ เพื่อให้รู้ว่าโปรแกรมกำลังทำงาน

BackgroundWorker Background Process

ในขณะโปรแกรมทำงาน หน้าจอจะไม่ค้าง สามารถคลิกหรือทำอย่างอื่นได้









Note!! ในตัวอย่างแรกจะเป็นการประกาส Class ของ BackgroundWorker ขึ้นมา แต่ปกติแล้วใน Windows Form Application มีเครื่องมือของ BackgroundWorker รองรับให้ใช้งานได้เลย

BackgroundWorker Background Process

ลาก BackgroundWorker ขึ้นมาบน Form

BackgroundWorker Background Process

เป็นส่วนของ Event ต่าง ๆ คือ .DoWork, .ProgressChanged และ .RunWorkerCompleted

Code (C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoProgressWorking
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
                this.btnStart.Enabled = false;
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        // This event handler updates the progress.
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
           this.lblResult.Text = (e.ProgressPercentage.ToString() + "%");
        }

        // This event handler deals with the results of the background operation.
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                this.lblResult.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                this.lblResult.Text = "Error: " + e.Error.Message;
            }
            else
            {
                this.lblResult.Text = "Done!";
            }
            this.btnStart.Enabled = true;
            MessageBox.Show("Working Finished.");
        }

    }
}
BackgroundWorker Syntax (VB.Net)
Imports System.ComponentModel

Public Class Form1

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.WorkerSupportsCancellation = True

    End Sub

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        If BackgroundWorker1.IsBusy <> True Then
            ' Start the asynchronous operation.
            BackgroundWorker1.RunWorkerAsync()
            Me.btnStart.Enabled = False
        End If
    End Sub

    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        If BackgroundWorker1.WorkerSupportsCancellation = True Then
            ' Cancel the asynchronous operation.
            BackgroundWorker1.CancelAsync()
        End If
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
        Dim i As Integer

        For i = 1 To 10
            If (worker.CancellationPending = True) Then
                e.Cancel = True
                Exit For
            Else
                ' Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500)
                worker.ReportProgress(i * 10)
            End If
        Next
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        Me.lblResult.Text = (e.ProgressPercentage.ToString() + "%")
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If e.Cancelled = True Then
            Me.lblResult.Text = "Canceled!"
        ElseIf e.Error IsNot Nothing Then
            Me.lblResult.Text = "Error: " & e.Error.Message
        Else
            Me.lblResult.Text = "Done!"
        End If
        Me.btnStart.Enabled = True
        MessageBox.Show("Working Finished.")
    End Sub

End Class


ซึ่งทั้ง 2 วิธีได้ผลลัพธ์ที่เหมือนกัน ขึ้นอยู่ว่าจะชอบวิธีไหนมากกว่า


.


   
Share
Bookmark.   

  By : TC Admin
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2015-10-08
  Download : No files
Sponsored Links
แก้ปัญหา Facebook Like หายเมื่อเปลี่ยนจาก HTTP เป็น HTTPS
แก้ปัญหา Facebook Like หายเมื่อเปลี่ยนจาก HTTP เป็น HTTPS
ในช่วงนี้หลายๆ เว็บกำลังเปลี่ยน เว็บจาก HTTP เป็น HTTPS และถ้ามีการใช้ Plugin Facebook Like / Shared คงจะเจอปัยหา Line หายกัน
Rating : Update : 2018-09-18 15:14:43
เปลี่ยนจาก MySQL ไปเป็น MySQLi with Prepare Statement
เปลี่ยนจาก MySQL ไปเป็น MySQLi with Prepare Statement
สืบเนื่องมาจากต้องเพิ่มความปลอกภัยของระบบมากยิ่งขึ้นโดยใช้มาตราฐายของ Open Web Application Security Project (OWASP) หนึ่งในปัญหาหลักที่พบนั่นก็คือเรื่องของ (‘SQL Injection’) (CWE-89)
Rating : Update : 2019-03-18 13:58:49
ACE Bootstrap Admin Template ฟรี Template สวยๆ เอาไปใช้งานกันได้เลยฟรีๆ
ACE Bootstrap Admin Template ฟรี Template สวยๆ เอาไปใช้งานกันได้เลยฟรีๆ
เป็น Boostrap Template ตัวหนึ่งที่ได้รับความนิยม และสามารถนำไปใช้งานได้ฟรี เคยเห็นเว็บไซต์หลายๆ ที่ในหน่วยงานราชการและเอกชนเอา Template ตัวนี้ไปใช้
Rating : Update : 2018-10-31 13:35:41
ASP.Net ส่ง Line Notify ข้อความเข้า Inbox ส่วนตัวหรือ Group ง่ายๆ ด้วย .Net (VB.Net/C#)
ASP.Net ส่ง Line Notify ข้อความเข้า Inbox ส่วนตัวหรือ Group ง่ายๆ ด้วย .Net (VB.Net/C#)
วิธีการใช้ Line ส่งข้อความเข้า Line ส่วนตัว หรือ ส่งข้อความเข้า Line Group ด้วย ASP.Net (VB.Net/C#) เหมาะสำหรับการแจ้งเตือนกิจกรรมต่างๆ ที่ต้องการทราบ เช่น รายการสมัครสมาชิก, กิจกรรมที่เกิดขั้นบนเว็บ , รายการสั่งซื้อ
Rating : Update : 2019-04-25 10:04:32
CI เชื่อมต่อ SQL SERVER Express
CI เชื่อมต่อ SQL SERVER Express
เขียน CI ให้เชื่อมต่อ SQL SERVER Express บน Server 2012 R2 และให้ Support ภาษาไทย(UTF-8)
Rating : Update : 2018-05-19 15:12:05
PHP ส่ง Line Notify ข้อความเข้า Inbox ส่วนตัวหรือ Group ง่ายๆ ด้วย PHP
PHP ส่ง Line Notify ข้อความเข้า Inbox ส่วนตัวหรือ Group ง่ายๆ ด้วย PHP
วิธีการใช้ Line ส่งข้อความเข้า Line ส่วนตัว หรือ ส่งข้อความเข้า Line Group ด้วย PHP เหมาะสำหรับการแจ้งเตือนกิจกรรมต่างๆ ที่ต้องการทราบ เช่น รายการสมัครสมาชิก, กิจกรรมที่เกิดขั้นบนเว็บ , รายการสั่งซื้อ
Rating : Update : 2019-04-23 10:59:06
วิธีการ Convert String ไปเป็น Date Time ของ SQL Server ในรูปแบบต่างๆ
วิธีการ Convert String ไปเป็น Date Time ของ SQL Server ในรูปแบบต่างๆ
Execute the following T-SQL scripts in Microsoft SQL Server Management Studio (SSMS) Query Editor to demonstrate T-SQL CONVERT and CAST functions in transforming string SQL date formats, string time & string datetime data to datetime data type. Practical examples for T-SQL DATE / DATETIME functions.
Rating : Update : 2018-08-10 13:01:19
ThaiCreate.Com Forum


Comunity Forum Free Web Script
Jobs Freelance Free Uploads
Free Web Hosting Free Tools

สอน PHP ผ่าน Youtube ฟรี
สอน Android การเขียนโปรแกรม Android
สอน Windows Phone การเขียนโปรแกรม Windows Phone 7 และ 8
สอน iOS การเขียนโปรแกรม iPhone, iPad
สอน Java การเขียนโปรแกรม ภาษา Java
สอน Java GUI การเขียนโปรแกรม ภาษา Java GUI
สอน JSP การเขียนโปรแกรม ภาษา Java
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Google Maps Api
สอน Windows Service
สอน Entity Framework
สอน Android
สอน Java เขียน Java
Java GUI Swing
สอน JSP (Web App)
iOS (iPhone,iPad)
Windows Phone
Windows Azure
Windows Store
Laravel Framework
Yii PHP Framework
สอน jQuery
สอน jQuery กับ Ajax
สอน PHP OOP (Vdo)
Ajax Tutorials
SQL Tutorials
สอน SQL (Part 2)
JavaScript Tutorial
Javascript Tips
VBScript Tutorial
VBScript Validation
Microsoft Access
MySQL Tutorials
-- Stored Procedure
MariaDB Database
SQL Server Tutorial
SQL Server 2005
SQL Server 2008
SQL Server 2012
-- Stored Procedure
Oracle Database
-- Stored Procedure
SVN (Subversion)
แนวทางการทำ SEO
ปรับแต่งเว็บให้โหลดเร็ว


สุดยอด Source Code V2.0
 

แจ้งชำระเงิน/โอนเงิน
 

Hit Link
   







Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2019 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 08-9968-0655 อัตราราคา คลิกที่นี่