多线程自托管WCF服务

时间:2011-04-20 17:23:04

标签: .net wcf

看起来WCF在使用自托管时只使用一个线程。我想为此使用多个线程或某种线程池。是否可以使用自托管配置或我需要使用IIS?

3 个答案:

答案 0 :(得分:10)

如果您在具有默认服务行为设置的UI应用程序中自托管服务,您可能会看到您正在描述的行为。默认服务行为使用同步上下文。在UI线程(WinForms,WPF)中启动服务主机的情况下,所有请求都被路由到公共窗口消息loop =>所有请求都由UI线程按顺序处理。

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

答案 1 :(得分:1)

[ServiceBehavior(UseSynchronizationContext = false)]

解决了我的问题。在阅读此注释后在服务和命令行应用程序中对此进行了测试,并且没有遇到相同的并发问题。因此,我很高兴地确认,在UI线程上实例化时,这只是一个问题。

我认为吸取的教训是为您的WCF测试工具使用命令行应用程序。

答案 2 :(得分:0)

我自我托管一切 - 保证它不是单线程的。上面的评论者可能在正确的轨道上 - 确保如果服务impl上的ServiceBehavior属性设置为InstanceContextMode.Single,您还设置了ConcurrencyMode.Multiple,否则您将只看到一个线程。如果您没有ServiceBehavior属性,则默认值将为您提供每个调用的服务impl的一个实例(InstanceContextMode.PerCall,ConcurrencyMode.Single)。也可能与连接限制有关,但可能你知道你是否在配置中设置了它。