Trong thực tế việc ứng dụng BackgroundWorker rất quan trọng khi xử lý dữ liệu số lượng nhiều, hay khi xử lý nghiệp nào đó mà thời gian đợi dài.
Tôi ví dụ khi bạn click nút Tính tồn kho trong phần mềm bán hàng, nếu 1 công ty nhiều mặc hàng và số lượng hóa đơn bán hàng nhiều thì việc tính tồn kho có thể mất tầm 10 phút, trong quá trình tính mà phần mềm chỉ làm 1 việc tính thì sẽ không thể làm việc khác, như vậy trong trường này phải dùng để BackgroundWorker trong C# để tạo ra 1 Thread riêng để xử lý, khi đó phần mềm vừa tồn kho bạn cũng có thể làm các nghiệp vụ khác trong phần mềm bán hàng.
Tóm lại về mặc kỹ thuật: BackgroundWorker trong WinForms (Windows Forms) là một lớp hỗ trợ thực thi công việc ở background (nền) mà không làm treo giao diện người dùng (UI). Nó rất hữu ích khi bạn cần thực thi các tác vụ tốn thời gian (như đọc file lớn, truy xuất CSDL, tải dữ liệu từ mạng...) mà vẫn muốn giao diện phản hồi tốt (ví dụ: không bị "Not Responding").
DoWork: Nơi bạn viết logic chạy nền.
ProgressChanged: Được gọi khi bạn muốn cập nhật tiến trình lên UI (nếu có WorkerReportsProgress = true).
RunWorkerCompleted: Được gọi khi công việc hoàn tất (thành công, lỗi hoặc bị huỷ).
WorkerReportsProgress (bool): Có cho phép báo tiến trình không.
WorkerSupportsCancellation (bool): Có cho phép hủy giữa chừng không.
IsBusy: Kiểm tra có đang chạy không.
RunWorkerAsync(): Bắt đầu chạy công việc nền.
CancelAsync(): Yêu cầu huỷ công việc nền.
ReportProgress(percent): Báo tiến trình về giao diện.
Tạo 1 form, có sự kiện form load
int tongSoHangHoa;
private void Form1_Load(object sender, EventArgs e)
{
tongSoHangHoa= 1000;
}
B1: Thêm control button và BackgroundWorker vào form c#
private void btButton1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
B2: Chuyển qua event của BackgroundWorker
- DoWork: code thực thi, ví dụ tính tồn kho cho 1 nghìn mặc hàng thì for 1 nghìn lần
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i < tongSoHangHoa; i++)
{
backgroundWorker1.ReportProgress(i); // báo cáo qua ProgressChanged
}
// Chú ý: code trong DoWork, không gọi được các control từ winform (vì chạy với 1 thread khác)
// Chỉ gọi được control từ hàm ProgressChanged
}
- ProgressChanged: sau khi xong 1 bảng ghi (hàng hóa) thì bên DoWork sẽ báo qua
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
- RunWorderCompleted: là hàm sau khi kết thúc code bên backgroundWorker1_DoWork sẽ gọi RunWorkerCompleted.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Đã xong !");
}
-Để truyền tham số vào cho DoWork xử lý hãy sử dụng tham số
DoWork(object sender, DoWorkEventArgs e)
Khi click button thêm lệnh:
DataTable dt = new DataTable();
dt.Columns.Add("MaHang");
dt.Rows.Add("01"); dt.Rows.Add("02");
backgroundWorker1.RunWorkerAsync(dt);
bên DoWork, ép kiểu từ e.Argument sang DataTable
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dtG= (DataTable)e.Argument;
for (int i = 1; i < tongSoChay; i++)
{
backgroundWorker1.ReportProgress(i);
}
}
- Đang chạy muốn dừng
Để thực hiện được nghiệp vụ này bạn cần set thuộc tính WorkerSupportsCancellation bằng true
Kiểm tra thuộc tính CancellationPending ở hàm DoWork (đang xử lý mới cancel được),
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true; // thì doWork kết thúc code luôn
backgroundWorker1.ReportProgress(0);
return;
}
if (myBackgroundWorker.IsBusy) // nếu đang xử lý mới Cancel, nếu xong rồi thì bỏ qua
{
myBackgroundWorker.CancelAsync();
}
Hướng dẫn BackgroundWorker trong winform C# để làm gì, phục vụ gì cho công việc làm phần mềm.