9

我有一个包含 UI 组件的 WCF 服务,这迫使我处于 STA 模式。

如何将服务行为设置为 STA 模式?


该服务使用对 WPF DLL 文件的引用,该文件打开 UI 窗口(用作查看端口)以进行图片分析。当服务尝试创建该项目的实例(从窗口继承)时,它会引发异常:

调用线程必须是 STA

4

3 回答 3

1

我正在做和你类似的事情。

我的解决方案是通过 STA 线程队列路由所有调用。我使用来自新并行框架的线程安全集合来排队我想在 STA 线程上运行的操作。然后,我有 X 个 STA 线程不断检查队列以执行新操作。

于 2008-09-08T13:10:17.117 回答
0

我会调查使用 [STAThread] 属性来切换线程模型。例如

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

STAThread 属性说明

但是我很困惑为什么您在 Web 服务中使用 UI 组件。你能解释一下你为什么要这样做吗?

于 2008-09-08T10:48:43.647 回答
0

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>

希望这可以节省您一些时间

于 2016-05-09T15:31:34.747 回答