并行Foreach引发ApartmentState异常

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

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

彼得·杜尼奥(Peter Duniho)

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

您问的是错误的问题。

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

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

除非您希望在流程中增加UI线程(实际上,您不希望这样做……只会引入一系列其他新问题),否则您尝试在此处完成的操作根本不适合使用的Parallel.ForEach()或任何其它并发的技术。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章