Sử dụng Background Worker trong lập trình Windows Form với C#
BackgroundWorker là một component (nằm trong namespace System.ComponentModel) giúp cho việc lập trình Thread trở nên dễ dàng do các thuộc tính và event mà nó hỗ trợ sẵn. Lớp này được .NET cung cấp với mục đích quản lý các tiến trình chạy nền, ít hao tốn tài nguyên nhất.
Bài viết này sẽ giới thiệu cách sử dụng BackgroundWoker để làm một ví dụ tính tổng 2 số sử dụng progress bar theo kiểu gọi bất đồng bộ.
Lớp BackgroundWorker có những thuộc tính quan trọng sau :
- WorkerReportsProgress: cho phép tiến trình báo cáo tiến độ của công việc (nếu là true)
- WorkerSupportsCancellation: cho phép dừng tiến trình trong khi đang thực thi (nếu là true)
- CancellationPending: cờ báo dừng tiến trình (= true nghĩa là có lệnh dừng tiến trình)
Lớp BackgroundWorker được quản lý thông qua 3 sự kiện chính:
- DoWork: đoạn mã thực hiện công việc sẽ được đặt ở đây. Sự kiện này xảy ra khi bắt đầu tiến trình.
- ProgressChanged: xảy ra khi tiến độ của tiến trình có sự thay đổi hoặc khi ta gọi hàm ReportProgress() của lớp BackgroundWorker.
- RunWorkerCompleted: xảy ra khi tiến trình hoàn tất hoặc bị hủy bỏ.
Để sử dụng BackgroundWorker trong Windows Form, bạn có thể kéo component vào từ Toolbox trong thẻ Components và sử dụng như các control thông thường.
Ví dụ: Tính tổng của 2 số, dùng lớp BackgroundWorker để quản lý việc chạy một vòng lặp và hiển thị tiến độ lên thanh ProgressBar..
Screen shot
1. Thiết kế Form
2. Demo
C# source code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace BgWorker_demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void display(string thongbao)
{
MessageBox.Show(thongbao);
}
private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
if (bgWorker1.CancellationPending)
{
e.Cancel = true;
}
else
{
async();
bgWorker1.ReportProgress(i);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
bgWorker1.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
bgWorker1.CancelAsync();
}
private void bgWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
lbl1.Text = e.ProgressPercentage.ToString() + " % completed";
}
private void bgWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
display("The program is stopped");
}
else
{
try
{
double a = Convert.ToDouble(textBox1.Text);
double b = Convert.ToDouble(textBox2.Text);
double c = a + b;
textBox3.Text = Convert.ToString(c);
display("Already completed");
}
catch (Exception ex)
{
throw ex;
}
}
}
public void async()
{
Thread.Sleep(100);
}
}
}
[Nghean-Aptech]
Các tin mới hơn:
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.
Học lập trình React JS trong vòng 5 phút.
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.
Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.
Các tin cũ hơn:
Học Java thì để làm gì.
Cách tối ưu WordPress hay nhất.
Lập trình viên 2014: Những kỹ năng cần có.
RWD đơn giản với CSS và DIV.
Dữ liệu Lớn (Big Data) là gì.