Sử dụng BackgroundWorker để xây dựng chức năng chạy nền trong C#

Một phần của tài liệu Đề tài: Chia sẻ file ảnh (Trang 32)

Để hỗ trợ lập trình viên phát triển các chức năng đa tiến trình, tiến trình chạy song song (chạy nhiều tác vụ cùng một lúc) C# đã cung cấp cho bạn lớp Thread trong namspace System.Threading.

BackgroundWorkermột component trong System.ComponentModel. Đây là lớp được .Net tích hợp nhằm giúp lập trình viên xây dựng, quản lý các tiến trình chạy nền trong ứng dụng dễ dàng hơn và hiệu xuất tốt hơn, dễ dàng hơn so với việc sử dụng Thread.

Hiện tại BackgroundWorker(.Net phiên bản mình sử dụng là 4.0) thì lớp này được cung cấp các thuộc tính sau:

2.5.1. Các thuộc tính chủ yếu:

– WorkerReportsProgress : mặc định là False. Thuộc tính này nếu là True thì event ProgressChanged sẽ được thực thi (trong này bạn xử lý để hiển thị tiến độ công việc như thanh xử lý tiến trình, % tiến trình).

– WorkerSupportsCancellation : mặc định là False. Thuộc tính này nếu là True thì thao tác ngừng tiến trình có hiệu lực.

– CancellationPending : biến bool tiếp nhận trạng thái dừng tiến trình. Nếu giá trị là True tức là tiến trình được yêu cầu dừng.

– IsBusy: biến bool tiếp ghi nhận trạng thái hoạt động của BackgroundWorker, mặc

định là False. Nếu kiểm tra (!IsBusy) thì tức là tiến trình đang bận xử lý. 2.5.2. Các sự kiện chính trong lớp BackgroundWorker:

– DoWork: các thao tác xử lý công việc (lấy dữ liệu, tìm kiếm, update…) được diễn ra tại đây.

– ProgressChanged: các xử lý hiển thị thông báo tiến độ của tiến trình đặt ở đây. – RunWorkerCompleted: các xử lý khi tiến trình hoàn tất hoặc bị ngừng bởi người dùng.

Quy trình làm việc của BackgroundWorker - Gọi RunWorkerAsync()

- Phương thức OnDoWork() được thực thi - Thuộc tính IsBusy sẽ có giá trị true

- Khi OnDoWork() thực hiện xong, OnRunWorkerCompleted() sẽ được gọi. Cập nhật tiến độ công việc: Trong quá trình BackgroundWorker đang thực thi, bạn có thể dùng phương thức ReportProgress() với tham số là phần trăm tiến độ hoàn thành công việc để kích hoạt sự kiện ProgressChanged nhằm cập nhật tiến độ thực hiện công việc lên màn hình. Để sử dụng được tính năng này, bạn cần gán thuộc tínhWorkerReportsProgress bằng true.

Hủy bỏ việc thực thi: Bạn có thể gọi phương thức CancelAsync() trong lúc BackgroundWorker đang hoạt động để dừng công việc đang thực hiện. Khi đó thuộc tính CancellationPending sẽ có giá trị true. Mặc dù bạn gọi phương thức CancelAsync() nhưng công việc có thể vẫn tiếp tục hoạt động, vì vậy bạn cần dựa vào CancellationPending để kiểm tra và ngừng công việc lại. Để sử dụng được tính năng này, bạn cần gán WorkerSupportsCancellation bằng true.

Truy xuất đến các control của Form: để làm được điều này bạn có thể đặt

Control.CheckForIllegalCrossThreadCalls bằng true. Tuy nhiên cách chính quy là gọi thông qua các delegate. Sử dụng phương thức Invoke() để gọi một delegate với cú pháp của anonymous method hoặc lambda expression. Ví dụ:

Chương 3: Chương trình chia sẻ file ảnh 3.1. Ý tưởng của chương trình

Cài đặt một server trên máy

Client chia sẻ ảnh lên server mà khi đăng nhập server có thể nhìn thấy ảnh

Một phần của tài liệu Đề tài: Chia sẻ file ảnh (Trang 32)