Nhân viên nền trong .NET

Tram Ho

Hi anh em, chúc mọi người một ngày làm việc hiệu quả và đây năng lượng. Hôm nay mình sẽ giới thiệu về background worker trong .NET.

Không để anh em chờ lâu, cùng bắt đầu vào bài viết nào. Bài viết này mình sẽ nói về định nghĩa, các thuộc tính, các phương thức, sự kiện và cách sử dụng background worker trong .NET.

1. Background worker là gì?

  • BackgroundWorker là một class được cung cấp bởi .NET Framework để thực hiện các công việc tốn nhiều thời gian (long-running tasks) hoặc công việc đồng bộ trên một thread độc lập, giúp tránh tình trạng block ứng dụng khi thực hiện các tác vụ nặng.
  • BackgroundWorker thường được sử dụng trong các ứng dụng Windows Forms hoặc WPF để thực hiện các công việc tốn nhiều thời gian và cập nhật giao diện người dùng một cách liên tục.
  • Background worker không sử dụng được với .NET core. Nhưng .NET framework, .NET 5 và .NET 6 (long-term support) thì có support.

Note: nhưng có 1 lưu ý là với .NET 5 và .NET 6 không khuyến khích sử dụng Background worker. Khuyến khích sử dụng Task-based Asynchronous Programming (TAP) như tasks, async, await.. để thực hiện các công việc tốn thời gian dài (long-running tasks).

2. Lợi ích khi sử dụng background worker

  • Tránh block UI: Nếu bạn thực hiện các công việc nặng trong chương trình chính (UI thread), nó có thể gây block ứng dụng, khiến người dùng không thể tương tác với ứng dụng trong khi các công việc này đang được thực hiện. BackgroundWorker giúp thực hiện các công việc này trên một thread độc lập, tránh block ứng dụng và giúp người dùng có thể tiếp tục tương tác với ứng dụng.
  • Cập nhật tiến trình của công việc: BackgroundWorker cung cấp sự kiện ProgressChanged, cho phép bạn cập nhật tiến trình của công việc trên giao diện người dùng một cách liên tục. Điều này giúp người dùng biết được tình trạng của công việc và tăng trải nghiệm người dùng.
  • Quản lý tác vụ dễ dàng: BackgroundWorker cung cấp các phương thức để quản lý tác vụ, cho phép bạn bắt đầu hoặc hủy bỏ tác vụ một cách dễ dàng.
  • Dễ dàng tích hợp vào ứng dụng Windows Forms hoặc WPF: BackgroundWorker được thiết kế để tích hợp vào ứng dụng Windows Forms hoặc WPF một cách dễ dàng và linh hoạt.

3. Các properties trong background worker

Sau đây là một số thuộc tính thường được sử dụng và ví dụ:

  • WorkerReportsProgress: Get hoặc Set giá trị cho phép BackgroundWorker hỗ trợ báo cáo tiến trình. Các sự kiện được báo cáo tiến trình trong BackgroundWorker được sử dụng để thông báo tiến độ của một công việc nền tới UI thread. Khi thuộc tính WorkerReportsProgress được đặt là true, bạn có thể sử dụng phương thức ReportProgress để báo cáo tiến trình của công việc nền.

  • WorkerSupportsCancellation: Thuộc tính WorkerSupportsCancellation trong BackgroundWorker được sử dụng để cho phép người dùng hủy một công việc nền đang thực thi. Khi thuộc tính này được đặt là true, bạn có thể sử dụng phương thức CancelAsync để hủy thực hiện một công việc nền.

  • CancellationPending: Get giá trị để kiểm tra xem người dùng đã yêu cầu hủy bỏ việc thực hiện một công việc nền hay chưa. Trả về boolean.

  • IsBusy: Lấy giá trị cho biết BackgroundWorker có đang chạy một hoạt động nền hay không.

  • DoWorkEventArgs: Lấy đối số được truyền vào cho xử lý sự kiện DoWork.

  • Error: Lấy lỗi nếu có bất kỳ lỗi nào xảy ra trong quá trình thực thi của hoạt động chạy nền (background).

  • Result: Lấy kết quả của hoạt động chạy nền (background).

4. Các phương thức (methods) trong background worker

  • CancelAsync(): Yêu cầu hủy bỏ công việc đang thực thi bằng cách đặt giá trị CancellationPending thành true.
  • ReportProgress(int percentProgress, object userState): Báo cáo tiến trình công việc đang thực thi và truyền dữ liệu bổ sung (nếu có) thông qua đối số userState.
  • RunWorkerAsync(object argument): Gửi yêu cầu bắt đầu thực thi công việc nền và truyền tham số (nếu có).
  • Dispose(): Giải phóng tài nguyên được sử dụng bởi BackgroundWorker.

Ngoài ra, BackgroundWorker cũng cung cấp các sự kiện để cho phép ứng dụng phản hồi khi thực hiện công việc đang chạy:

  • DoWork: Sự kiện xảy ra khi công việc bắt đầu thực thi.
  • ProgressChanged: Sự kiện xảy ra khi tiến trình của công việc được báo cáo.
  • RunWorkerCompleted: Sự kiện xảy ra khi công việc hoàn thành hoặc bị hủy.

5. Một vài use case sử dụng background worker

  • Download dữ liệu lớn từ Internet: Khi ứng dụng cần phải tải dữ liệu lớn từ internet, thì việc thực hiện trong chính luồng UI sẽ làm cho ứng dụng bị đơ và không phản hồi. Trong trường hợp này, có thể sử dụng Background Worker để tải dữ liệu trong nền, và cập nhật tiến độ tải dữ liệu qua ProgressChanged event.
  • Xử lý dữ liệu lớn: Khi ứng dụng cần phải xử lý dữ liệu lớn, ví dụ như chuyển đổi định dạng hình ảnh, thì việc thực hiện trong chính luồng UI sẽ làm cho ứng dụng bị đơ và không phản hồi. Trong trường hợp này, có thể sử dụng Background Worker để xử lý dữ liệu trong nền, và cập nhật tiến độ xử lý qua ProgressChanged event.
  • Gửi email: Khi ứng dụng cần phải gửi email, việc thực hiện trong chính luồng UI sẽ làm cho ứng dụng bị đơ và không phản hồi. Trong trường hợp này, có thể sử dụng Background Worker để gửi email trong nền, và cập nhật tiến độ gửi email qua ProgressChanged event.
  • Đọc dữ liệu từ file: Khi ứng dụng cần phải đọc dữ liệu từ file lớn, thì việc thực hiện trong chính luồng UI sẽ làm cho ứng dụng bị đơ và không phản hồi. Trong trường hợp này, có thể sử dụng Background Worker để đọc dữ liệu trong nền, và cập nhật tiến độ đọc dữ liệu qua ProgressChanged event.
  • Tính toán phức tạp: Khi ứng dụng cần phải thực hiện tính toán phức tạp, ví dụ như tính toán đường cong trong đồ họa, thì việc thực hiện trong chính luồng UI sẽ làm cho ứng dụng bị đơ và không phản hồi. Trong trường hợp này, có thể sử dụng Background Worker để tính toán trong nền, và cập nhật tiến độ tính toán qua ProgressChanged event.

Ví dụ về sử dụng background worker khi download dữ liệu từ internet:

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo