3.Điều gì sẽ xảy ra nếu bạn xóa thuộc tính này?
Tôi chỉ thêm một ví dụ đơn giản thể hiện sự cố.
Tôi đã tạo ứng dụng WinForms đơn giản bằng nút và OpenFileDialog. Khi nhấn nút, tôi chạy một chuỗi chỉ ra openFileDialog. Tôi khởi động ứng dụng có và không có STAThread và kết quả của việc nhấp vào nút giống nhau - nó ném ngoại lệ "Thao tác chéo không hợp lệ: Kiểm soát 'Form1' được truy cập từ một chuỗi khác với chuỗi được tạo trên". Có vẻ như không có sự khác biệt. Nhưng không.
Sau đó, tôi đã thay đổi hiển thị OpenFileDialog bằng cách gọi phương pháp dưới đây:
private void ShowOFD()
{
if (InvokeRequired)
{
BeginInvoke(new Action(ShowOFD));
return;
}
openFileDialog1.ShowDialog(this);
}
Với STAThread nó hoạt động tốt như mong đợi. Nếu không có STAThread nó ném ngoại lệ: "Chủ đề hiện tại phải được đặt thành chế độ căn hộ đơn lẻ (STA) trước khi có thể thực hiện các cuộc gọi OLE. Đảm bảo rằng chức năng chính của bạn có STAThreadAttribute được đánh dấu trên đó. cho quá trình ".
Sau đó, tôi khởi chạy ứng dụng nhiều lần mà không cần trình gỡ lỗi (tách ra khỏi studio trực quan). Một lần ứng dụng chỉ đóng lặng lẽ, một lần khác ứng dụng đóng với thông báo "vshost đã ngừng hoạt động"
Có thể trùng lặp: http://stackoverflow.com/questions/102437/why-do-all-winforms-programs-require-the-stathread-attribute –
@Cody: Vâng, xin lỗi, tôi không thấy, nhưng IMHO câu trả lời này tốt hơn nhiều so với câu trả lời khác. –
Vâng, đó là công bằng. Tôi không bỏ phiếu để đóng vì những câu trả lời đó không tuyệt vời. Các bit quan trọng nhất của kiến thức để thu thập từ câu hỏi đó là liên kết này: http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx –