1

У меня есть следующий код для создания tabpages по заранее составленному списку:Parallel 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?

ответ

1

Каков правильный способ установки состояния квартиры в STA?

Вы задаете неправильный вопрос.

Во-первых, вы не можете установить состояние квартиры для рабочих потоков, используемых здесь. Вы не являетесь владельцем потоков, и состояние должно быть установлено до того, как поток начнет работать.

Но второй и что еще более важно, даже если вы могли бы установить состояние, это только условие необходимо для объектов, которые вы пытаетесь создать, а не достаточной один. Объекты пользовательского интерфейса должны создаваться не только в потоке STA, они должны быть созданы в потоке STA с насосом сообщений. То есть основной поток пользовательского интерфейса в вашей программе.

Если вы не хотите распространять потоки пользовательского интерфейса в своем процессе (и, действительно, вы не делаете & hellip; это просто вводит целый ряд других проблем), операция, которую вы пытаетесь выполнить здесь, просто не подлежит применению Parallel.ForEach() или любой другой методике параллелизма.

Вы должны использовать обычный foreach, и если есть возможность для параллелизма здесь (то есть выполнение асинхронных HTTP-запросов), пусть сам объект WebBrowser сам справится с этим.

+0

Очень понятный и удобный – ehh

+0

Как вы сказали, здесь это не полезно, но вы можете запускать 'Parallel.ForEach' на потоках STA. Вы делаете это, используя пользовательский 'TaskScheduler', поддерживаемый потоками STA, а затем указывая его в' ParallelOptions'. – svick

 Смежные вопросы

  • Нет связанных вопросов^_^