Исключение состояния потока - PullRequest
2 голосов
/ 22 декабря 2010

Я использую watin в классе и вызываю этот класс в фоновом режиме Do Work, но в первой строке выдается исключение

The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.

Что я могу сделать?

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

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010

COM, дедушка .NET, делает то, чего не делает .NET.Вы можете написать .NET-программу, которая использует List <> в потоке, и если вы не заблокируете ее должным образом, она потерпит неудачу без диагностики.COM, однако, знает о требованиях к потокам COM-компонента.И если компонент говорит, что он не является потокобезопасным, то вы не можете игнорировать это.Что означает сообщение об ошибке, его можно использовать только в «однопоточной квартире», STA.Поток STA имеет функцию автоматического перенаправления вызова, сделанного для компонента, из рабочего потока в поток, создавший компонент.Совершенно похоже на Control.Invoke (), но выполняется автоматически.

Это ограничивает ваши варианты использования многопоточного режима строго.Кроме поддержания этого потока в потоке пользовательского интерфейса приложения с графическим интерфейсом, единственное, что вы можете сделать, - это создать поток STA, в котором вы создаете экземпляры IE и watin. Этот ответ показывает вам, как.Обратите внимание, что BackgroundWorker не может этого сделать, его метод DoWork всегда выполняется в потоке MTA.Ключевой частью связанного кода является Thread.SetApartmentState, чтобы переключить поток в STA и цикл сообщений, запущенный Application.Run ().И то, и другое необходимо для правильной работы этих компонентов COM.

1 голос
/ 22 декабря 2010

Фоновый рабочий использует потоки из ThreadPool, которые, по моему мнению, являются MTA по умолчанию. Вы должны создать новый Thread экземпляр и вызвать SetApartmentState (STA) на нем.

...