[英]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.