Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 多线程自托管WCF服务_.net_Wcf - Fatal编程技术网

.net 多线程自托管WCF服务

.net 多线程自托管WCF服务,.net,wcf,.net,Wcf,在使用自托管时,WCF似乎只使用一个线程。我想为此使用几个线程或某种线程池。是否可以使用自托管配置,或者我需要使用IIS进行此操作?我自托管所有内容-保证它不是单线程的。上面的Commenter可能是正确的-请确保如果service impl上的ServiceBehavior属性设置为InstanceContextMode.Single,那么您也设置了ConcurrencyMode.Multiple,否则您将只看到一个线程。如果没有ServiceBehavior属性,则默认情况下,每次调用将为您

在使用自托管时,WCF似乎只使用一个线程。我想为此使用几个线程或某种线程池。是否可以使用自托管配置,或者我需要使用IIS进行此操作?

我自托管所有内容-保证它不是单线程的。上面的Commenter可能是正确的-请确保如果service impl上的ServiceBehavior属性设置为InstanceContextMode.Single,那么您也设置了ConcurrencyMode.Multiple,否则您将只看到一个线程。如果没有ServiceBehavior属性,则默认情况下,每次调用将为您提供一个service impl实例(InstanceContextMode.PerCall、ConcurrencyMode.Single)。也可能与连接限制有关,但您可能知道是否在配置中设置了连接限制。

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

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

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


我认为学到的教训是为您的WCF测试线束使用命令行应用程序。

是什么让您认为它只使用一个线程?实例模式的设置是什么?我在调试器中观察到了它。我不知道实例模式。我如何改变它?顺便说一句,我不使用WCF配置应用程序和App.config文件。调试器不是真实的。而且您可能也没有很好的测试。请记住,调试器在暂停时默认情况下会阻止所有线程,因此传入的请求似乎不会得到服务。我已尝试使用一个具有5个并行线程的客户端,然后使用两个客户端。另外,我尝试延迟从服务方法返回,我可以看到下一个请求直到第一个请求完成才被服务。太好了!成功了。非常感谢。但您的意思可能是UseSynchronizationContext=false。它也取决于客户端实现,并且每个方法调用都需要ServiceFactory.CreateChannel