Trong phiên bản .NET framework 4.0, Microsoft đã bổ sung nhiều thư viện hỗ trợ việc xử lý đa luồng (multi-threading), nhằm đơn giản hóa việc lập trình lẫn hiệu suất của chương trình. Trong bài viết này, tôi xin hướng dẫn các bạn sử dụng lớp System.Threading.Task.
Task
Một Task đại diện cho một số công việc cần phải hoàn thành. Các công việc này có thể chạy trong 1 thread riêng hoặc có thể thực thi một cách đồng bộ, và kết quả được chờ đợi trả về ở thread gọi nó.
Task là một lớp trừu tượng, bạn có nhiều kiểm soát hơn là việc sử dụng Thread.
Task cho phép bạn tổ chức công việc một cách linh hoạt. Ví dụ:
· Định nghĩa các công việc tiếp theo, được làm sau khi 1 task khác kết thúc. Công việc có thể khác khi công việc trước đó thực thi thành công hay thất bại.
· Nhận được kết quả trả từ một luồng khác.
· Kiểm soát lỗi tốt hơn.
· Dễ dàng chờ đợi 1 hay nhiều Task thực thi xong.
Tạo một Task (công việc)
Để tạo 1 Task mà không cần nhận lại kết quả:
Cách 1:
Cách 2:
Thực hiện Task liên tiếp
Với Task, bạn có thể chỉ ra 1 công việc thực hiện sau khi một công việc khác hoàn thành (tương tự như Background Worker)
Với TaskContinuationOptions, bạn chỉ ra điều kiện để thực hiện công việc tiếp theo khi công việc trước đó hoàn thành.
Trong ví dụ dưới đây, Task 3 sẽ thực hiện trong trường hợp Task 2 bị lỗi (throw new exception)
Bạn có thể tham khảo thêm TaskContinuationOptions ở trang MSDN
Nhận kết quả trả về từ Task
Để nhận được kết quả trả về từ Task, bạn sử dụng class Task với T là kiểu dữ liệu của kết quả trả về.
Dưới đây là 3 cách gọi hàm:
Lưu ý: TResult property sẽ khóa luồng gọi Task cho đến khi Task đó thực hiện xong.
Chờ đợi 1 (hoặc nhiều) Task
Để chờ đợi 1 Task hoàn thành, bạn gọi hàm Task.Wait
Để chờ đợi nhiều Task thực thi xong, bạn gọi hàm Task.WaitAll(Task[]).
Kết luận:
Hi vọng với bài viết nhỏ này, bạn nắm được các cách cơ bản để thực thi 1 công việc đa luồng và kiểm soát chúng tốt hơn.
Trong phần tới, tôi sẽ hướng dẫn bạn viết 1 ví dụ thực tế về cách sử dụng Task trong lập trình.
Không có nhận xét nào:
Đăng nhận xét