WebBrowser является COM компонентом под капотом. Квартира с многопоточностью, COM заботится о вызове своих методов безопасным для потоков способом. По этой причине ваш вызов Navigate () работает, он фактически выполняется в потоке пользовательского интерфейса. Что не работает, так это свойство DocumentText, оно реализовано в оболочке .NET, и они в некоторой степени искали код. Он взрывается, когда поддержка взаимодействия COM в CLR замечает, что поток в MTA пытается получить доступ к свойству компонента, который живет на STA.
Ваш вызов SetApartmentState () неверен. Это сделано не с того потока, поток пользовательского интерфейса уже является STA. Кроме того, причина того, что это не бомба, вы не можете изменить состояние квартиры потока после его запуска. Вы должны вызвать его в объекте Thread, который вы создали. Это по-прежнему не решает вашу проблему, два потока STA не совместимы.
Два основных способа решения вашей проблемы. Во-первых, вы сами создаете объект WebBrowser в отдельном потоке STA. Код в этом ответе показывает, как это сделать.
Браузер, который вы создаете таким образом, также не отображается в вашей форме. Что является вторым способом, соберите вызов сами с помощью Control.Invoke (). Однако делать это довольно бессмысленно, так как весь ваш код выполняется в потоке пользовательского интерфейса, вы не получаете параллелизма. Здесь нет бесплатного обеда. Запуск его в потоке только дает вам головную боль. Если вам нужно время для обработки текста документа, запустите этот код в отдельном потоке.