如何制作WCF服务STA(单线程)

时间:2008-09-08 10:41:05

标签: .net wcf web-services multithreading user-interface

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

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


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

  

调用线程必须是STA

3 个答案:

答案 0 :(得分:1)

我正在做类似你的事。

我的解决方案是通过STA线程队列路由所有呼叫。我使用了来自新parallel framework的线程安全集合来排队我想在STA线程上运行的动作。然后,我有X个STA线程,不断检查队列中是否有新的动作要执行。

答案 1 :(得分:0)

我会调查使用[STAThread]属性来切换线程模型。 e.g。

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

Description of the STAThread attribute

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

答案 2 :(得分:0)

ServiceBehaviour属性允许您指定行为。对于单线程,您将使用以下命令:

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

might want to read about different InstanceContextMode可帮助您更好地选择服务的行为方式。

您还需要添加到app.config新服务行为(或编辑现有服务行为):

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

并在您的行为配置中以相同的app.config设置behaviorConfiguration,如下所示:

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

希望这能节省你一些时间