8

在 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 对象。
4

2 回答 2

8

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

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

因此,在这种情况下,该属性应该无效。

于 2012-11-28T11:26:14.877 回答
3

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

于 2012-11-28T11:33:00.747 回答