SetApartmentState и [STAThread]

в Watin это исходный код, есть такой фрагмент кода:

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

поскольку созданный поток имеет свой набор состояния квартиры, почему [STAThread] атрибут добавлен в метод? Меня не интересует конкретный фрагмент кода, но мне интересно, если STAThread атрибут необходим вообще.

Примечания:

  • метод GoToNoWaitInternal не используется в другом месте.
  • весь проект watin о манипулировании WebBrowser объекты (окна Internet explorer в целом). Таким образом, мы манипулируем COM-объекта.

2 ответов


просто прочитайте документацию для STAThreadAttribute (выделено мной):

применить этот атрибут к методу точки входа (Main() метод в C# и Visual Basic). это не влияет на другие методы. чтобы установить состояние квартиры потоков, которые вы запускаете в своем коде, используйте Thread.SetApartmentState метод перед началом потока.

Итак, в этом случае атрибут не должен иметь никакого эффекта.


следует отметить, что STA (однопоточная квартира) является моделью резьбы, используемой pre-.Net Visual Basic. Он должен использоваться только на основном методе компонентов, которые будут подвержены COM. Автор кода, который вы пытаетесь понять, внешне не понял, как его предполагается использовать.