【问题标题】:Parallel Foreach throw an ApartmentState exceptionParallel Foreach 抛出一个 ApartmentState 异常
【发布时间】:2016-09-21 05:04:58
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    你问错问题了。

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

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

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

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

    【讨论】:

    • 就像你说的,这里没用,但是你可以在 STA 线程上运行Parallel.ForEach。为此,您可以使用由 STA 线程支持的自定义 TaskScheduler,然后在 ParallelOptions 中指定它。
    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多