2012-11-28 9 views
8

W Watin na source code, tam jest ten kawałek kodu:SetApartmentState i [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); 
    } 

Ponieważ wątek utworzony ma swoje mieszkanie zestaw państwowej, dlaczego jest atrybutem [STAThread] dodany do metody? Nie interesuje mnie konkretny fragment kodu, ale zastanawiam się, czy w ogóle potrzebny jest atrybut STAThread.

Uwagi:

  • Sposób GoToNoWaitInternal nie jest używany w innym miejscu.
  • Cały projekt watin dotyczy manipulowania obiektami WebBrowser (ogólnie przeglądarki Internet Explorer). W ten sposób manipulujemy obiektem COM.

Odpowiedz

6

Wystarczy przeczytać dokumentację STAThreadAttribute kopalni (nacisk):

Zastosuj ten atrybut metody punktu wejścia (metoda w C# i Visual Basic Main()). Nie ma wpływu na inne metody. Aby ustawić stan początkowy wątków w kodzie, należy użyć metody Thread.SetApartmentState przed uruchomieniem wątku.

W takim przypadku atrybut nie powinien wywoływać żadnego efektu.

+0

Musi istnieć powód [Jeroen van Menen] (http://stackoverflow.com/users/52173/jeroen-van-menen) dodał go – Odys

+0

@odyodyodys Musiałbyś go o to zapytać. – svick

+0

Należy zauważyć, że 'STAThreadAttribute' only effects' main() ', ponieważ jest używane tylko w [ApplicationActivator.CreateInstance] (https://msdn.microsoft.com/en-us/library/ms146108%28v=vs.110%29. aspx), możesz zobaczyć, jak ten atrybut jest używany w [Źródło odniesienia] (https://referencesource.microsoft.com/#mscorlib/system/applicationactivator.cs,104) (w metodzie "wewnętrznej", 'ApplicationActivator. ExecuteAsAssembly() ') – jrh

3

Należy zauważyć, że STA (Single Threaded Apartment) to model gwintowania używany przez pre -Net Visual Basic. Powinien być używany tylko w głównej metodzie komponentów, które będą wystawione na COM. Autor kodu, który próbujesz zrozumieć, najwyraźniej nie rozumiał, w jaki sposób ma być używany.

Powiązane problemy