Parallel Foreach抛出一个aparmentstate异常

本文关键字:一个 aparmentstate 异常 Foreach Parallel | 更新日期: 2023-09-27 18:08:14

我有以下代码来创建一个预定义列表的选项卡页:

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

Parallel Foreach抛出一个aparmentstate异常

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

你问错问题了。

首先,你不能为这里使用的工作线程设置公寓状态。你不拥有线程,并且必须在线程开始运行之前设置状态。

但第二,也是更重要的,即使你可以设置状态,那也只是一个必要条件,而不是一个充分条件。UI对象不仅需要在STA线程中创建,还需要在具有消息泵的STA线程中创建。例如,程序中的主UI线程。

除非您希望进程中出现大量的UI线程(实际上,您不希望这样做,那样只会带来一系列新的问题),否则您在这里尝试完成的操作根本不适合使用Parallel.ForEach()或任何其他并发技术。

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