STAThead на DLL для использования с Task / BackgroundWorker - PullRequest
2 голосов
/ 10 февраля 2011

Доброе утро,

Я сделал простую dll, в которой я использую элемент управления WebBrowser для выполнения некоторых простых задач. Теперь я хочу использовать его методы из основного пользовательского интерфейса в отдельном Task или BackgroundWorker. Проблема в том, что всякий раз, когда я использую методы, я получаю исключение "no STAThread" ... Как я могу обойти это? Конечно, в dll нет метода Main(), и я не могу добавить атрибут STAThread в конструктор.

Большое спасибо.

1 Ответ

4 голосов
/ 10 февраля 2011

Что ж, чтобы запустить код в новом потоке STA, вы должны создать новый поток и явно сделать его STAThread, используя Thread.SetApartmentState перед его запуском. Затем вам нужно будет использовать Control.BeginInvoke для перенаправления вызовов обратно в поток пользовательского интерфейса - вы не хотите использовать BackgroundWorker или Task, так как они будут использовать поток пула потоков.

С другой стороны, не ясно, поможет ли это в этом случае - если вы используете WebBrowserControl, вам, вероятно, потребуется запустить цикл обработки сообщений и т. Д.

Не совсем понятно, что вы подразумеваете под "использовать его методы из основного интерфейса". Является ли этот WebBrowserControl часть пользовательского интерфейса, который работает в нормальном потоке пользовательского интерфейса? Если это так, вам нужно маршалировать в этот поток из другого потока (например, используя Control.BeginInvoke) - и другой поток не обязательно должен быть потоком STA, чтобы это произошло. *

...