Tôi đang học C# 3.5 và tôi muốn biết những gì [STAThread]
thực hiện trong các chương trình của chúng tôi?[STAThread] làm gì?
Trả lời
STAThreadAttribute
về bản chất là một yêu cầu cho máy bơm thông báo Windows để giao tiếp với các thành phần COM. Mặc dù các hình thức Windows lõi không sử dụng COM, nhiều thành phần của hệ điều hành như các hộp thoại hệ thống sử dụng công nghệ này.
MSDN giải thích lý do một cách chi tiết hơn một chút:
STAThreadAttribute chỉ ra rằng mô hình luồng COM cho ứng dụng là đơn luồng căn hộ. Thuộc tính này phải là xuất hiện trên điểm truy cập của bất kỳ ứng dụng nào sử dụng Biểu mẫu Windows; nếu nó bị bỏ qua, các thành phần Windows có thể không hoạt động chính xác. Nếu không có thuộc tính, ứng dụng sử dụng mô hình căn hộ đa diện , không phải là được hỗ trợ cho Windows Forms.
This blog post (Tại sao STAThread yêu cầu?) cũng giải thích các yêu cầu khá tốt. Nếu bạn muốn có một cái nhìn sâu hơn về cách mô hình luồng hoạt động ở cấp CLR, hãy xem this MSDN Magazine article from June 2004 (Đã lưu trữ, tháng 4 năm 2009).
Nó cho trình biên dịch biết rằng bạn đang ở trong một mô hình Căn hộ đơn lẻ. Đây là một điều COM ác, nó thường được sử dụng cho Windows Forms (GUI) vì sử dụng Win32 cho bản vẽ của nó, được thực hiện như STA. Nếu bạn đang sử dụng một cái gì đó đó là mô hình STA từ nhiều chủ đề sau đó bạn nhận được các đối tượng bị hỏng.
Đây là lý do tại sao bạn phải gọi lên Gui từ một chuỗi khác (nếu bạn đã thực hiện bất kỳ mã hóa biểu mẫu nào).
Về cơ bản đừng lo lắng về điều đó, chỉ chấp nhận rằng các chủ đề GUI của Windows phải được đánh dấu là STA nếu không thì những thứ kỳ lạ xảy ra.
STAThread không có gì liên quan đến yêu cầu gọi chủ đề chính khi truy cập GUI.Điều này đơn giản là do tính chất của máy bơm thông điệp Windows, và không thể tránh được nhiều hơn trong các ứng dụng đa luồng. – Noldorin
Thực sự, nó chỉ là về giao dịch với các thành phần COM như hộp thoại hệ điều hành và các thành phần của bên thứ ba. – Noldorin
Win32 không có khái niệm về căn hộ luồng, COM của nó mà giới thiệu khái niệm. COM "tái nhiệm vụ" một hệ thống bất khả tri chủ đề hoàn toàn là gì (máy bơm thông báo cửa sổ) như một phương tiện để đồng bộ hóa/thực thi mã tuần tự trong các căn hộ COM. – AnthonyWJones
Thuộc tính STAThreadA đánh dấu một sợi để sử dụng đơn lẻ COM Căn hộ nếu COM là cần thiết. Theo mặc định , .NET sẽ không khởi tạo COM tại tất cả. Chỉ khi COM là cần thiết, như khi một đối tượng COM hoặc Điều khiển COM được tạo hoặc khi thả 'n' thả là cần thiết, COM đó được khởi tạo. Khi xảy ra sự cố , .NET gọi hàmCoInitializeEx bên dưới, sẽ có cờ cho biết để nối chuỗi với một chuỗi hoặc đơn luồng đơn đa luồng.
đọc biết thêm here (lưu trữ, June 2009)
và
bất kỳ ý tưởng tại sao CompactFramework không hỗ trợ '[STAThread]'? – bvdb