Как сделать сервис WCF STA (однопоточным) - PullRequest
9 голосов
/ 08 сентября 2008

У меня есть служба WCF, которая включает компоненты пользовательского интерфейса, что вынуждает меня работать в режиме STA.

Как установить режим обслуживания в режиме STA?


Служба использует ссылку на файл DLL WPF, который открывает окно пользовательского интерфейса (используется как порт просмотра) для анализа изображения. Когда служба пытается создать экземпляр этого элемента (наследуется от окна), она выдает исключение:

Вызывающий поток должен быть STA

Ответы [ 3 ]

1 голос
/ 08 сентября 2008

Я делаю что-то похожее на тебя.

Мое решение состояло в том, чтобы направить все вызовы через очередь потока STA. Я использовал потокобезопасную коллекцию из новой параллельной структуры , чтобы поставить в очередь Действия, которые я хотел выполнить в потоке STA. Затем у меня было количество потоков STA, которые постоянно проверяли очередь на наличие новых действий для выполнения.

0 голосов
/ 09 мая 2016

Атрибут ServiceBehaviour позволяет указать поведение. В вашем случае для одного потока вы бы использовали следующее:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)]
public class Service : IService
{
}

Вы , возможно, захотите прочитать о различных InstanceContextMode s, чтобы помочь вам лучше выбрать, как вы хотите, чтобы сервис работал.

Вам также необходимо добавить к вашему app.config новое служебное поведение (или отредактировать существующее):

    <behavior name="wsSingleThreadServiceBehavior">
      <serviceThrottling maxConcurrentCalls="1"/>
    </behavior>

и в вашей конфигурации поведения в том же app.config установите поведенческую конфигурацию следующим образом:

 <service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" />
  </service>

Надеюсь, это сэкономит вам время

0 голосов
/ 08 сентября 2008

Я бы исследовал использование атрибута [STAThread] для переключения модели потоков. например,

[STAThread]
static void Main()
{
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new Host() };
        ServiceBase.Run(ServicesToRun);
}

Описание атрибута STAThread

Но я запутался, почему вы вообще используете компоненты пользовательского интерфейса в веб-сервисе. Не могли бы вы рассказать немного больше о том, почему вы пытаетесь это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...