SetApartmentState and [STAThread]

Odys picture Odys · Nov 28, 2012 · Viewed 8.3k times · Source

In Watin's source code, there is this piece of code:

    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);
    }

Since the thread created has its apartment state set, why is the [STAThread] attribute added to the method? I am not interested in the specific piece of code, but I am wondering if STAThread attribute is needed at all.

Notes:

  • The method GoToNoWaitInternal isn't used elsewhere.
  • The whole watin project is about manipulating WebBrowser objects (Internet explorer windows in general). Thus, we are manipulating a COM Object.

Answer

svick picture svick · Nov 28, 2012

Just read the documentation for STAThreadAttribute (emphasis mine):

Apply this attribute to the entry point method (the Main() method in C# and Visual Basic). It has no effect on other methods. To set the apartment state of threads you start in your code, use the Thread.SetApartmentState method before starting the thread.

So, in this case, the attribute should have no effect.