Parallel Foreach 抛出 ApartmentState 异常

Parallel Foreach throw an ApartmentState exception

我有以下代码用于为预定义列表创建标签页:

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);
            });
    }

我遇到以下异常:

cannot be instantiated because the current thread is not in a single-threaded apartment.

将公寓状态设置为 STA 的正确方法是什么?

What is the correct way to set the apartment state to STA?

你问错问题了。

首先,您不能为此处使用的工作线程设置单元状态。您不拥有线程,必须在线程启动前设置状态 运行.

但其次也是更重要的是,即使您可以设置状态,对于您尝试创建的对象来说,这只是 必要的 条件,而不是 足够一个。 UI 对象不仅需要在 STA 线程中创建,还需要在具有消息泵的 STA 线程中创建。 IE。程序中的主 UI 线程。

除非你想在你的进程中增加 UI 个线程(实际上,你不想......那只会引入一大堆其他问题),你正在尝试的操作此处的完成根本不适合使用 Parallel.ForEach() 或任何其他并发技术。

你应该只使用常规的 foreach,如果这里有并发的机会(即异步执行 HTTP 请求),让 WebBrowser 对象自己管理它。