SetApartmentState和[STAThread]

时间:2012-11-28 11:10:01

标签: c# multithreading com watin sta

在Watin的source 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);
    }

由于创建的线程设置了其单元状态,为什么[STAThread]属性被添加到方法中?我对特定的代码段不感兴趣,但我想知道是否需要STAThread属性。

注意:

  • 方法GoToNoWaitInternal未在其他地方使用。
  • 整个watin项目是关于操纵WebBrowser对象(一般是Internet Explorer窗口)。因此,我们正在操纵COM对象。

2 个答案:

答案 0 :(得分:8)

请阅读STAThreadAttribute(强调我的)文档:

  

将此属性应用于入口点方法(C#和Visual Basic中的Main()方法)。 它对其他方法没有影响。要设置您在代码中开始的线程的单元状态,请在启动线程之前使用Thread.SetApartmentState方法。

因此,在这种情况下,该属性应该没有效果。

答案 1 :(得分:3)

应该注意的是,STA(单线程单元)是pre-.Net Visual Basic使用的线程模型。它应仅用于将暴露给COM的组件的Main方法。您试图理解的代码的作者,显然不明白它应该如何使用。