看起来 WCF 在使用自托管时只使用一个线程。我想使用多个线程或某种类型的线程池来处理这个问题。这在自托管配置中是否可行?还是需要使用 IIS?
看起来 WCF 在使用自托管时只使用一个线程。我想使用多个线程或某种类型的线程池来处理这个问题。这在自托管配置中是否可行?还是需要使用 IIS?
如果您在UI应用程序中使用默认服务行为设置自托管该服务,那么您可能会看到您所描述的行为。默认服务行为使用同步上下文。如果在UI线程(WinForms、WPF)中启动服务主机,则所有请求都将路由到常见的Windows消息循环=>所有请求都由UI线程按顺序处理。
在任何其他情况下(包括手动设置[ServiceBehavior(UseSynchronizationContext = false)]
以在UI线程中托管服务),服务主机将从线程池中调度新的线程来处理每个请求。基于实例上下文模式和并发模式,还有一些进一步的区别,但是在默认设置下,您将看到我所描述的行为。
[ServiceBehavior(UseSynchronizationContext = false)]
问题已解决。在阅读了这条评论后,在服务和命令行应用程序中进行了测试,没有遇到同样的并发问题。因此,我很高兴确认只有在 UI 线程上实例化时才会出现问题。
我认为我们可以从中得到教训,即在 WCF 测试工具中使用命令行应用程序。
我自己托管所有的东西,保证不是单线程的。上面的评论者可能在正确的轨道上 - 确保如果你的服务实现上的ServiceBehavior属性设置为InstanceContextMode.Single,那么你也设置了ConcurrencyMode.Multiple,否则你只会看到一个线程。如果您没有ServiceBehavior属性,则默认情况下每个调用将给您提供一个服务实现实例(InstanceContextMode.PerCall,ConcurrencyMode.Single)。这也可能与连接限制有关,但假设您已在配置中设置它,那么您应该知道。