SetApartmentState和[STAThread]

Ody*_*dys 8 c# com multithreading watin sta

在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);
    }
Run Code Online (Sandbox Code Playgroud)

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

笔记:

  • 该方法GoToNoWaitInternal不在别处使用.
  • 整个watin项目是关于操纵WebBrowser对象(一般的Internet Explorer窗口).因此,我们正在操纵COM对象.

svi*_*ick 8

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

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

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