如何使WCF服务STA(单线程)

时间:2020-03-05 18:49:16  来源:igfitidea点击:

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

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

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

The calling thread must be an STA

解决方案

回答

我将研究使用[STAThread]属性来切换线程模型。
例如

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

STAThread属性的描述

但是我很困惑,为什么我们根本要在Web服务中使用UI组件。我们能否解释一下为什么要这样做?

回答

我在做类似你的事。

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