2012-11-28 9 views
8

In Watin der source code gibt es dieses Stück Code:SetApartmentState und [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); 
    } 

Da das erzeugte Thread seine Wohnung Zustand gesetzt hat, warum ist das [STAThread] Attribut dem Verfahren hinzugefügt? Ich bin nicht an dem spezifischen Stück Code interessiert, aber ich frage mich, ob STAThread Attribut überhaupt benötigt wird.

Anmerkungen:

  • Verfahren GoToNoWaitInternal nicht an anderer Stelle verwendet wird.
  • Das ganze wattin Projekt ist über die Manipulation von WebBrowser-Objekten (Internet-Explorer-Fenster im Allgemeinen). Daher manipulieren wir ein COM-Objekt.

Antwort

6

Lesen Sie die Dokumentation für STAThreadAttribute (Hervorhebung von mir):

Wenden Sie dieses Attribut auf den Eintrittspunkt-Methode (die Main() Methode in C# und Visual Basic). Es hat keine Auswirkungen auf andere Methoden. Um den Apartmentstatus von Threads festzulegen, die Sie in Ihrem Code starten, verwenden Sie die Methode Thread.SetApartmentState, bevor Sie den Thread starten.

In diesem Fall sollte das Attribut keine Auswirkungen haben.

+0

Es muss einen Grund geben [Jeroen van Menen] (http://stackoverflow.com/users/52173/jeroen-van-menen) hat es hinzugefügt – Odys

+0

@odyodyodys Sie müssten ihn danach fragen. – svick

+0

Beachten Sie, dass 'STAThreadAttribute' nur' main() 'bewirkt, da es nur in [ApplicationActivator.CreateInstance] (https://msdn.microsoft.com/en-us/library/ms146108%28v=vs.110%29) verwendet wird. aspx), können Sie sehen, wie dieses Attribut in der [Referenzquelle] (https://referencesource.microsoft.com/#mscorlib/system/applicationactivator.cs104) verwendet wird (in einer internen Methode, ApplicationActivator). ExecuteAsAssembly() ') – jrh

3

Es sollte beachtet werden, dass das STA (Single Threaded Apartment) das Threading-Modell ist, das von pre.Net Visual Basic verwendet wird. Es sollte nur für die Main-Methode von Komponenten verwendet werden, die COM ausgesetzt werden. Der Autor des Codes, den Sie zu verstehen versuchen, hat offensichtlich nicht verstanden, wie er verwendet werden soll.