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-.NetVisualBasicで使用されているスレッドモデルであることに注意してください。これは、COMに公開されるコンポーネントのメインメソッドでのみ使用する必要があります。あなたが理解しようとしているコードの作者は、どうやらそれがどのように使われるべきかを理解していなかったようです。

于 2012-11-28T11:33:00.747 に答える