BackgroundWorker trong winform C# là gì

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.

  1. Thực thế BackgroundWorker trong c# winform để làm gì?
  2. Cách sử dụng BackgroundWorker c# winform khi làm phần mềm
  3. Một số nghiệp vụ hay gặp khi làm phần mềm với backgroundWorker

1. Thực thế BackgroundWorker trong c# winform để làm gì?

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ý 1 nghiệp nào đó mà thời gian đợi dài.

Tôi ví dụ khi bạn click 1 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.

2. Cách sử dụng BackgroundWorker c# winform khi làm phần mềm
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 !");
        }

3. Một số nghiệp vụ hay gặp khi làm phần mềm với backgroundWorker

-Để 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;
                }


    Gọi hàm CancelAsync để hủy thread

            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.