我有一个包含 UI 组件的 WCF 服务,这迫使我处于 STA 模式。
如何将服务行为设置为 STA 模式?
该服务使用对 WPF DLL 文件的引用,该文件打开 UI 窗口(用作查看端口)以进行图片分析。当服务尝试创建该项目的实例(从窗口继承)时,它会引发异常:
调用线程必须是 STA
我有一个包含 UI 组件的 WCF 服务,这迫使我处于 STA 模式。
如何将服务行为设置为 STA 模式?
该服务使用对 WPF DLL 文件的引用,该文件打开 UI 窗口(用作查看端口)以进行图片分析。当服务尝试创建该项目的实例(从窗口继承)时,它会引发异常:
调用线程必须是 STA
我正在做和你类似的事情。
我的解决方案是通过 STA 线程队列路由所有调用。我使用来自新并行框架的线程安全集合来排队我想在 STA 线程上运行的操作。然后,我有 X 个 STA 线程不断检查队列以执行新操作。
我会调查使用 [STAThread] 属性来切换线程模型。例如
[STAThread]
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Host() };
ServiceBase.Run(ServicesToRun);
}
但是我很困惑为什么您在 Web 服务中使用 UI 组件。你能解释一下你为什么要这样做吗?
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>
希望这可以节省您一些时间