(Post 30/10/2007) Phân luồng căn hộ là một chế độ an toàn luồng tự động, liên minh chặt chẽ với COM – Mô hình đối tượng thành phần kế thừa của Microsoft. Mặc dù .NET phần lớn không sử dụng các mô hình luồng kế thừa, nhưng đôi khi nó vẫn phát triển do nhu cầu tương tác với các API cũ hơn. Luồng căn hộ phù hợp nhất với Biểu mẫu Windows, vì phần lớn Biểu mẫu Windows sử dụng hoặc kết hợp API Win32 lâu đời – hoàn chỉnh với di sản căn hộ của nó.
- Phần 1: Tổng quan và khái niệm
- Phần 2: Tạo và bắt đầu chủ đề
- Phần 3: Cơ bản về đồng bộ hóa
- Phần 4: Khóa và an toàn chỉ
- Phần 5: Ngắt và hủy bỏ
- Phần 6: Trạng thái luồng
- Phần 7: Xử lý Chờ
- Phần 8: Bối cảnh đồng bộ hóa
Một căn hộ là một “thùng chứa” hợp lý cho các chủ đề. Căn hộ có hai kích thước – “đơn” và “đa”. Một căn hộ đơn luồng chỉ chứa một luồng; các căn hộ đa luồng có thể chứa bất kỳ số luồng nào. Mô hình đơn luồng là mô hình phổ biến hơn và có thể tương thích với nhau.
Cũng như chứa chủ đề, căn hộ chứa các đối tượng. Khi một đối tượng được tạo trong một căn hộ, nó sẽ ở đó suốt đời, mãi mãi là ngôi nhà cùng với (các) luồng cư dân. Điều này tương tự như một đối tượng được chứa trong ngữ cảnh đồng bộ hóa .NET, ngoại trừ việc ngữ cảnh đồng bộ hóa không sở hữu hoặc chứa các luồng. Bất kỳ luồng nào cũng có thể gọi một đối tượng trong bất kỳ ngữ cảnh đồng bộ hóa nào – tùy thuộc vào việc chờ khóa độc quyền. Nhưng các đối tượng chứa trong căn hộ chỉ có thể được gọi bằng một sợi trong căn hộ.
Hãy tưởng tượng một thư viện, nơi mỗi cuốn sách đại diện cho một đối tượng. Không được phép mượn – sách được tạo trong thư viện ở đó suốt đời. Hơn nữa, hãy sử dụng một người để đại diện cho một chuỗi.
Thư viện ngữ cảnh đồng bộ hóa cho phép bất kỳ người nào tham gia, miễn là chỉ có một người vào tại một thời điểm. Thêm nữa, và một hàng đợi hình thành bên ngoài thư viện.
Thư viện chung cư có nhân viên thường trú – một thủ thư duy nhất cho thư viện đơn luồng và cả nhóm cho thư viện đa luồng. Không ai được phép ngoài các thành viên của nhân viên – người bảo trợ muốn thực hiện nghiên cứu phải ra hiệu cho thủ thư, sau đó yêu cầu thủ thư thực hiện công việc đó! Việc báo hiệu cho thủ thư được gọi là điều phối – người bảo trợ điều khiển phương thức gọi tới một nhân viên (hoặc nhân viên!) Điều chỉnh là tự động và được thực hiện ở đầu thủ thư thông qua một máy bơm tin nhắn – trong Windows Forms, điều này là cơ chế liên tục kiểm tra các sự kiện bàn phím và chuột từ hệ điều hành. Nếu tin nhắn đến quá nhanh để được xử lý, chúng sẽ nhập hàng đợi tin nhắn để có thể xử lý theo thứ tự chúng đến.
Chỉ định Mô hình Căn hộ
Một chuỗi .NET được tự động gán một căn hộ khi nhập Win32 hiểu biết về căn hộ hoặc mã COM kế thừa. Theo mặc định, nó sẽ được phân bổ một căn hộ đa luồng, trừ khi một người yêu cầu một căn hộ một luồng như sau:
Thread t = new Thread (…);
t.SetApartmentState (ApartmentState.STA);
Người ta cũng có thể yêu cầu luồng chính tham gia một căn hộ đơn luồng bằng cách sử dụng thuộc tính STAThread trên phương thức main:
Chương trình lớp {
[STAThread]
static void Main () {
…
Các căn hộ không có hiệu lực trong khi thực thi mã .NET thuần túy. Nói cách khác, hai luồng có trạng thái căn hộ là STA có thể đồng thời gọi cùng một phương thức trên cùng một đối tượng và sẽ không có chức năng tự động điều chỉnh hoặc khóa nào diễn ra. Chỉ khi thực thi chạm vào mã không được quản lý, chúng mới có thể bắt đầu.
Các kiểu trong không gian tên System.Windows.Forms gọi mã Win32 một cách rộng rãi được thiết kế để hoạt động trong một căn hộ đơn luồng. Vì lý do này, chương trình Windows Forms phải có thuộc tính [STAThread] trên phương thức chính của nó, nếu không một trong hai điều sẽ xảy ra khi đạt đến mã giao diện người dùng Win32:
- nó sẽ dẫn đến một căn hộ đơn luồng
- nó sẽ sụp đổ
Control.Invoke
Trong ứng dụng Windows Forms đa luồng, việc gọi một phương thức hoặc thuộc tính trên điều khiển từ bất kỳ luồng nào khác với luồng đã tạo ra nó là bất hợp pháp. Tất cả các lệnh gọi xuyên luồng phải được sắp xếp một cách rõ ràng cho luồng đã tạo điều khiển (thường là luồng chính), sử dụng phương thức Control.Invoke hoặc Control.BeginInvoke. Người ta không thể dựa vào tính năng sắp xếp tự động vì nó diễn ra quá muộn – chỉ khi việc thực thi diễn ra tốt vào mã không được quản lý, lúc đó nhiều mã .NET nội bộ có thể đã chạy trên luồng “sai” – mã không an toàn cho luồng.
Một giải pháp tuyệt vời để quản lý các luồng công nhân trong các ứng dụng Windows Forms là sử dụng BackgroundWorker. Lớp này bao bọc các luồng công nhân cần báo cáo tiến độ và hoàn thành, đồng thời tự động gọi Control.Invoke theo yêu cầu.
(Sưu tầm)
FPT Aptech – Hệ Thống Đào Tạo Lập Trình Viên Quốc Tế
FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng. |