Этот вызов WCF, скорее всего, поступает в поток, отличный от основного потока пользовательского интерфейса. Все элементы управления пользовательского интерфейса, включая элементы ActiveX, должны создаваться и доступны из потока пользовательского интерфейса и только из потока пользовательского интерфейса. Полученная ошибка указывает на то, что поток создания отсутствует даже в однопотоковой квартире (STA), что также является требованием.
Чтобы получить код, выполняющийся в основном потоке пользовательского интерфейса, используйте метод Control.Invoke
. Это приведет к выполнению делегата в потоке, в котором находится цель Control
или Form
.
Если у вас нет ссылки на Control
или Form
, сразу же доступной, вам нужно будет создать ее. Возможно, вам придется создать поток, который также запускает цикл сообщений. Это можно сделать с помощью Application.Run
. Достаточно просто создать скрытый Form
, который можно использовать для вызова Invoke
.
Вот как это может выглядеть.
void SomeMethodExecutingOnThreadPool()
{
var form = null;
var mre = new ManualResetEvent(false);
// Create the UI thread.
new Thread(
() =>
{
form = new Form();
form.Load +=
(sender, args) =>
{
mre.Set();
}
Application.Run(form);
}).Start();
// Wait for the UI thread to initialize.
mre.WaitOne();
// You can now call Invoke.
form.Invoke(/* ... */);
}