WatIn многопоточность - PullRequest
       16

WatIn многопоточность

2 голосов
/ 30 марта 2011

Как я могу работать с WatIn, используя async делегатов?Я пытался, но он вернул эту ошибку:

Для CurrentThread необходимо, чтобы для ApartmentState было установлено значение ApartmentState.STA, чтобы можно было автоматизировать Internet Explorer.

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Полагаю, вы используете BeginInvoke() для своих делегатов.Они используют пул потоков для выполнения многопоточной работы, и все потоки в пуле потоков являются MTA.Вам придется сделать это по старинке, создав собственную Thread.Класс потока предлагает методы (GetApartmentState и SetApartmentState) для изменения модели квартиры.

Полагаю, вам может понадобиться и собственный насос сообщений в вашем thread.

Что-токак это может начать вас:

var th = new Thread(() => { /* do work */ });
th.SetApartmentState(ApartmentState.STA);
th.Start();
1 голос
/ 28 апреля 2011

Использовать Требуется атрибут STA , начиная с NUnit 2.5.

РЕДАКТИРОВАТЬ

Использовать атрибут Квартира , начиная с NUnit3.0.

1 голос
/ 04 апреля 2011

Из-за характера взаимодействия IE COM его необходимо запускать в однопоточной квартире. Следующее скопировано со страницы [watin.org] по теме 1

Почему установка ApartmentState необходима в первую очередь?

Скопировано из MSDN:

«Поскольку классы COM используют квартиры, общеязыковая среда выполнения должна создать и инициализировать квартиру при вызове COM-объекта в COM ситуация взаимодействия Управляемый поток можно создать и ввести однопоточный квартира (СТА), которая позволяет только один нить или многопоточная квартира (MTA), который содержит один или несколько резьб.».

Поскольку Internet Explorer не является безопасным для потоков, нам нужно использовать STA.

Последствия

Использование WatiN прекрасно работает в консоли или Приложение GUI, когда вы применяете Атрибут [STAThread] для основного метод (единственная точка входа в приложение). Таким образом, главная тема работает как STA и все идет хорошо. когда используя бегун, такой как MBUnit, NUnit или любой другой бегун, который запускает основной Поток, ваш код / ​​тесты зависят от Квартиру положил бегун с.

Поведение WatiN, когда нить не является нитью STA.

WatiN бросит ThreadStateException при создании экземпляр WatiN.Core.IE класс, чтобы помочь вам напомнить, чтобы установить ApartmentState to STA.

...