Sử dụng Background worker để chạy nền trong C#

Sử dụng Background worker để chạy nền trong C#

Background worker là một thành phần trong winform, nó giúp cho việc lập trình Thread trở nên đơn giản hơn nhờ vào các sự kiện có sẵn của nó. Trong bài viết này, mình sẽ chia sẻ với bạn cách sử dụng Background worker để chạy nền một cái gì đó trong lập trình C# với winform.

Khai báo và tạo thủ tục cho Background worker

Từ hộp Toolbox, tìm đến BackgroundWorker và kéo thả nó vào form.

  • Import thư viện ComponentModel với cú pháp: using System.ComponentModel;
  • Thêm đoạn code sau:
int a = 0;
private void dosomething()
{
  for(int i=0; i<=100; i++)
  {
    a += 1;
    Thread.Sleep(500);
    backgroundWorker1.ReportProgress(i);
  }
}

Hàm dosomething() là hàm sẽ làm một trong việc gì đó. Trong hàm này mình sử dụng Thread.Sleep để giả lập tiến trình xử lý lâu để mình có thể thấy rõ hơn kết quả làm việc của BackgroundWorker. ReportProgress(i) sẽ trả về tiến trình thực thi.

Sử dụng các event của Background worker

Vào Properties của BackgroundWorker đã kéo thả, chuyển qua phần events và kích đôi hết tất cả các event để tạo hàm cho event đó.

Bâu giờ chúng ta sẽ viết lần lượt các hàm.

Sự kiện DoWork của Background Worker

Hàm này sẽ thực thi một công việc nào đó, nó là phần quan trọng, trong ví dụ này mình sẽ gọi hàm dosomething() vào.

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
 {
   dosomething();
 }

Sự kiện ProgressChanged của Background Worker

Đây là sự kiện báo cáo tiến trình thay đổi. Trong ví dụ này mình sẽ sử dụng một ProgressBar và cho thực hiện thay đổi giá trị của nó trong sự kiện này.

  • Kéo thả một progressBar và để tên mặc định là progressBar1
  • Trong sự kiện ProgressChanged thêm đoạn code như sau:
 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
   progressBar1.Value = e.ProgressPercentage;
   Application.DoEvents();
   textBox1.Text = a + " %";
 }

Sự kiện RunWorkerCompleted của Background Worker

Sự kiện này xảy ra khi tiến trình kết thúc. Trong ví dụ này, mình sẽ cho nó hiện một messagebox.như sau:

 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
   MessageBox.Show("Hoàn thành tiến trình","tiến trình kết thức", MessageBoxButtons.OK, MessageBoxIcon.Information);
 }

Như vậy là đã xong, bây giờ mình sẽ kéo thêm vào một nút bấm và sẽ gọi hàm backgroundWorker1.RunWorkerAsync(); khi click.

Kết quả:

Đang chạy

Đang chạy

Hoàn tất

Hoàn tất