多线程自托管WCF服务

6

看起来 WCF 在使用自托管时只使用一个线程。我想使用多个线程或某种类型的线程池来处理这个问题。这在自托管配置中是否可行?还是需要使用 IIS?


1
你为何认为它只使用一个线程?你的实例模式设置是什么? - John Saunders
我在调试器中观察到了它。我不知道实例模式。我该如何改变它?顺便说一下,我不使用 WCF 配置应用程序和 App.config 文件。 - Max
1
调试器并不是真实的生活。而且你可能也没有一个好的测试。 - John Saunders
请记住,调试器默认情况下会阻塞所有线程,因此在暂停时,传入的请求似乎没有被处理。 - nitzmahone
@Matt Davis,我刚刚尝试了一下记录线程ID的方法,我可以看到它保持不变。 - Max
显示剩余2条评论
3个回答

10

如果您在UI应用程序中使用默认服务行为设置自托管该服务,那么您可能会看到您所描述的行为。默认服务行为使用同步上下文。如果在UI线程(WinForms、WPF)中启动服务主机,则所有请求都将路由到常见的Windows消息循环=>所有请求都由UI线程按顺序处理。

在任何其他情况下(包括手动设置[ServiceBehavior(UseSynchronizationContext = false)]以在UI线程中托管服务),服务主机将从线程池中调度新的线程来处理每个请求。基于实例上下文模式和并发模式,还有一些进一步的区别,但是在默认设置下,您将看到我所描述的行为。


太好了!这样可以了。谢谢你。但是你可能想要使用 UseSynchronizationContext = false。 - Max
同样,这取决于客户端的实现,并且需要在每个方法调用时使用ServiceFactory.CreateChannel。 - volody

1
[ServiceBehavior(UseSynchronizationContext = false)]

问题已解决。在阅读了这条评论后,在服务和命令行应用程序中进行了测试,没有遇到同样的并发问题。因此,我很高兴确认只有在 UI 线程上实例化时才会出现问题。

我认为我们可以从中得到教训,即在 WCF 测试工具中使用命令行应用程序。


1

我自己托管所有的东西,保证不是单线程的。上面的评论者可能在正确的轨道上 - 确保如果你的服务实现上的ServiceBehavior属性设置为InstanceContextMode.Single,那么你也设置了ConcurrencyMode.Multiple,否则你只会看到一个线程。如果您没有ServiceBehavior属性,则默认情况下每个调用将给您提供一个服务实现实例(InstanceContextMode.PerCall,ConcurrencyMode.Single)。这也可能与连接限制有关,但假设您已在配置中设置它,那么您应该知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接