Parallel Foreach抛出一个ApartmentState异常

时间:2016-09-21 05:04:59

标签: c# multithreading threadpool parallel.foreach apartment-state

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

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的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

  

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

你问的是错误的问题。

首先,您无法为此处使用的工作线程设置单元状态。您不拥有线程,并且必须在线程开始运行之前设置状态。

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

除非你想要在你的进程中增加UI线程(实际上,你不会...只是引入了一系列新的其他问题),你在这里尝试完成的操作根本不适合使用Parallel.ForEach()或任何其他并发技术。

您应该只使用常规foreach,如果此处有并发机会(即异步执行HTTP请求),请让WebBrowser对象自行管理。