WCF服务不是multithreading的

我正在设计WPF应用程序使用的WCF服务。 该服务将由50个客户端使用并托管在多核服务器上。 这就是为什么我希望它是multithreading的。

这就是我宣布它的方式:

[ServiceContract( SessionMode = SessionMode.Required, Namespace = Constants.NameSpace, CallbackContract = typeof (ISaphirServiceCallback))] public interface ISaphirService [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerSession)] public partial class SaphirService : ISaphirService 

和服务器端配置:

                                                   

这是客户端配置:

                                 

问题是,每个请求都在同一个线程上处理。 我在互联网上查了很多但是一切对我来说都很好……

你们有什么想法吗?

谢谢 !

打开ServiceHost WCF会捕获当前的SynchronizationContext ,并将其用于所有调用。 WPF的同步上下文将每次调用发送到Dispatcher队列,最终在UI线程上执行。

你有两个选择:

  • 在没有同步上下文的其他线程上启动该服务。 这具有不阻止等待加载服务的UI线程的额外优点。 例如,您可以使用:

     Task.Run(() => serviceHost.Open()); 
  • 指定服务不应使用同步上下文:

     [ServiceBehavior(UseSynchronizationContext = false)] 

请注意,如果在服务方法中修改UI对象,则可能需要自己将它们分发回UI线程。

如果您希望您的服务在来自同一客户端的调用之间保持某种状态,那么值得一提的是InstanceContextMode=InstanceContextMode.PerSession 。 否则,您可以使用InstanceContextMode=InstanceContextMode.PerCall