2012-11-28 26 views
8

Trong Watin của source code, có đoạn mã này:SetApartmentState và [STAThread]

public void NavigateToNoWait(Uri url) 
    { 
     var thread = new Thread(GoToNoWaitInternal); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(url); 
     thread.Join(500); 
    } 

    [STAThread] 
    private void GoToNoWaitInternal(object uriIn) 
    { 
     var uri = (Uri)uriIn; 
     NavigateTo(uri); 
    } 

Kể từ sợi tạo đã thiết lập tình trạng căn hộ của mình, tại sao là thuộc tính [STAThread] bổ sung vào phương pháp này? Tôi không quan tâm đến đoạn mã cụ thể, nhưng tôi tự hỏi nếu có thuộc tính STAThread là cần thiết.

Ghi chú:

  • Phương pháp GoToNoWaitInternal không được sử dụng ở những nơi khác.
  • Toàn bộ dự án watin là về thao tác đối tượng WebBrowser (cửa sổ thám hiểm Internet nói chung). Vì vậy, chúng tôi đang thao tác một đối tượng COM.

Trả lời

6

Chỉ cần đọc tài liệu cho STAThreadAttribute (tôi nhấn mạnh):

Áp dụng thuộc tính này để các phương pháp điểm vào (các Main() phương pháp trong C# và Visual Basic). Nó không ảnh hưởng đến các phương pháp khác. Để đặt trạng thái căn hộ của chủ đề bạn bắt đầu bằng mã, hãy sử dụng phương thức Thread.SetApartmentState trước khi bắt đầu chuỗi.

Vì vậy, trong trường hợp này, thuộc tính sẽ không có hiệu lực.

+0

Phải có lý do [Jeroen van Menen] (http://stackoverflow.com/users/52173/jeroen-van-menen) đã thêm nó – Odys

+0

@odyodyodys Bạn sẽ phải hỏi anh ấy về điều đó. – svick

+0

Lưu ý rằng 'STAThreadAttribute' chỉ có hiệu ứng' main() 'vì nó chỉ được sử dụng trong [ApplicationActivator.CreateInstance] (https://msdn.microsoft.com/en-us/library/ms146108%28v=vs.110%29. aspx), bạn có thể xem cách thuộc tính này được sử dụng trong [Nguồn tham chiếu] (https://referencesource.microsoft.com/#mscorlib/system/applicationactivator.cs,104) (trong phương thức 'nội bộ',' ApplicationActivator. ExecuteAsAssembly() ') – jrh

3

Cần lưu ý rằng STA (Single Threaded Apartment) là mô hình luồng được sử dụng bởi Visual Basic trước. Nó chỉ nên được sử dụng trên phương pháp chính của các thành phần sẽ được tiếp xúc với COM. Tác giả của mã mà bạn đang cố gắng hiểu, không hiểu cách nó được cho là được sử dụng như thế nào.

Các vấn đề liên quan