簡體   English   中英

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

我收到以下異常:

無法實例化,因為當前線程不在單線程單元中。

將公寓狀態設置為 STA 的正確方法是什么?

將公寓狀態設置為 STA 的正確方法是什么?

你問錯了問題。

首先,您不能為此處使用的工作線程設置單元狀態。 您不擁有線程,並且必須在線程開始運行之前設置狀態。

但第二,更重要的是,即使您可以設置狀態,這只是您嘗試創建的對象的必要條件,而不是充分條件 UI 對象不僅需要在 STA 線程中創建,還需要在具有消息泵的 STA 線程中創建。 即程序中的主 UI 線程。

除非您希望在您的進程中大量使用 UI 線程(實際上,您不會……這只會引入一系列全新的其他問題),否則您在此處嘗試完成的操作根本不適合使用Parallel.ForEach()或任何其他並發技術。

您應該只使用常規的foreach ,如果這里有並發的機會(即異步執行 HTTP 請求),讓WebBrowser對象本身管理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM