我有一个WCF服务,其中包含UI组件,这迫使我处于STA模式。
如何将服务行为设置为STA模式?
该服务使用对WPF DLL文件的引用,该文件打开UI窗口(用作视图端口)进行图片分析。当服务尝试创建该项的实例(从窗口继承)时,它会抛出异常:
调用线程必须是STA
答案 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>
希望这能节省你一些时间