[STAThread] làm gì?


293

Tôi đang học C # 3.5 và tôi muốn biết những gì [STAThread]trong chương trình của chúng tôi?

Câu trả lời:


240

Về STAThreadAttributecơ bản, đây là một yêu cầu để bơm thông báo Windows giao tiếp với các thành phần COM. Mặc dù Windows Forms lõi không sử dụng COM, nhiều thành phần của HĐH như hộp thoại hệ thống sử dụng công nghệ này.

MSDN giải thích lý do chi tiết hơn một chút:

STAThreadAttribution chỉ ra rằng mô hình luồng COM cho ứng dụng là căn hộ đơn luồng. Thuộc tính này phải có mặt trên điểm vào của bất kỳ ứng dụng nào sử dụng Windows Forms; 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ẽ sử dụng mô hình căn hộ đa luồng, không được hỗ trợ cho Windows Forms.

Bài đăng trên blog này ( Tại sao STAThread được yêu cầu? ) Cũng giải thích yêu cầu này khá tốt. Nếu bạn muốn có một cái nhìn sâu hơn về cách thức hoạt động của mô hình luồng ở cấp độ CLR, hãy xem bài viết của Tạp chí MSDN này từ tháng 6 năm 2004 (Lưu trữ, tháng 4 năm 2009).


1
Bất cứ ý tưởng tại sao CompactFramework không hỗ trợ [STAThread]?
bvdb

1
stackoverflow.com/questions/4154429/apidorstate-for-dummies câu trả lời này khá dễ hiểu đối với những người như tôi. Đã thêm chỉ để tham khảo tại đây
Barış Akkurt

41

Nó báo cho trình biên dịch rằng bạn đang ở trong một mô hình Căn hộ một luồng. Đây là một điều COM xấu, nó thường được sử dụng cho Windows Forms (GUI) vì nó sử dụng Win32 cho bản vẽ của nó, được triển khai dưới dạng STA. Nếu bạn đang sử dụng mô hình STA nào đó từ nhiều luồng thì bạn sẽ nhận được các đối tượng bị hỏng.

Đây là lý do tại sao bạn phải gọi Gui từ một luồng khác (nếu bạn đã thực hiện bất kỳ hình thức mã hóa nào).

Về cơ bản, đừng lo lắng về điều đó, chỉ cần chấp nhận rằng các luồng Windows GUI phải được đánh dấu là STA nếu không có những điều kỳ lạ xảy ra.


2
STAThread không liên quan gì đến yêu cầu gọi luồng chính khi truy cập GUI. Điều này chỉ đơn giản là do bản chất của bơm thông báo Windows và không thể tránh được nói chung hơn trong các ứng dụng đa luồng.
Noldorin

3
Thực sự, đó chỉ là về việc xử lý các thành phần COM như hộp thoại HĐH và các thành phần của bên thứ ba.
Noldorin

3
Win32 không có khái niệm về căn hộ luồng, COM của nó giới thiệu khái niệm này. COM "thực hiện lại" những gì là một hệ thống bất khả tri hoàn toàn (bơm thông báo windows) như một phương tiện để đồng bộ hóa / thực hiện mã tuần tự trong các căn hộ COM.
AnthonyWJones

1
Chỉ cần chấp nhận rằng cửa sổ gui phải được đánh dấu là STA nếu không những điều kỳ lạ xảy ra. :))))))
Nipuna

1
@Noldorin "yêu cầu gọi chủ đề chính" - đây không phải là yêu cầu về mặt kỹ thuật . Các ngoại lệ xuyên chuỗi không xảy ra bên ngoài trình gỡ lỗi. Tham chiếu: stackoverflow.com/questions/3972727/ cường . Không nói rằng bạn không nên giải quyết vấn đề này tuy nhiên!
Shiv

31

STAThreadAttribution đánh dấu một chủ đề để sử dụng Căn hộ COM đơn luồng nếu cần COM. Theo mặc định, .NET sẽ không khởi tạo COM cả. Chỉ khi COM là cần thiết, như khi đối tượng COM hoặc Điều khiển COM được tạo hoặc khi cần kéo thả, COM đó được khởi tạo. Khi điều đó xảy ra, .NET gọi hàm CoInitializeEx nằm bên dưới, sẽ lấy một cờ cho biết liệu có nên nối luồng với căn hộ đa luồng hoặc đơn luồng hay không.

Đọc thêm thông tin ở đây (Lưu trữ, tháng 6 năm 2009)

Tại sao STAThread được yêu cầu?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.