1

事前定義されたリストにタブページを作成するための次のコードがあります。

private void CreateControls()
    {
        Parallel.ForEach(_websites,
            w =>
            {
                var tabPage = new TabPage(w.Name);
                var webBrowser = new WebBrowser();

                webBrowser.Navigate(w.Url);
                tabPage.Controls.Add(webBrowser);
                WebPagesTabControl.TabPages.Add(tabPage);
            });
    }

次の例外が発生します。

現在のスレッドがシングル スレッド アパートメントにないため、インスタンス化できません。

アパートメントの状態を STA に設定する正しい方法は何ですか?

4

1 に答える 1

1

アパートメントの状態を STA に設定する正しい方法は何ですか?

あなたは間違った質問をしています。

まず、ここで使用されるワーカー スレッドのアパートメント状態を設定することはできません。スレッドを所有していないため、スレッドの実行を開始する前に状態を設定する必要があります。

しかし、2 つ目の重要な点は、状態を設定できたとしても、それは作成しようとしているオブジェクトの必要条件にすぎず、十分条件ではありません。UI オブジェクトは、STA スレッドで作成する必要があるだけでなく、メッセージ ポンプを持つ STA スレッドで作成する必要があります。つまり、プログラムのメイン UI スレッドです。

プロセス内で UI スレッドを急増させたい場合を除き (実際にはそうではありません...それは、まったく新しいホストの他の問題を引き起こすだけです)、ここで達成しようとしている操作は、単純に使用に適していません。 ofParallel.ForEach()またはその他の同時実行技術。

通常foreachの を使用する必要があります。ここで同時実行の機会がある場合 (つまり、HTTP 要求を非同期で実行する場合)、WebBrowserオブジェクト自体にそれを管理させます。

于 2016-09-21T06:01:28.950 に答える