大多数问题的答案取决于您如何管理服务的并发性。没有明确的答案,因为这取决于您为ConcurrencyMode
and设置的内容InstanceContextMode
。WCF 的并发管理将使您能够微调服务的线程行为和性能。MSDN 上提供了有关并发管理的冗长而艰巨(但非常详细)的阅读。
InstanceContextMode
允许您定义应如何实例化您的服务。对于执行大量繁重工作并处理大量调用的服务,一般的想法是使用实PerCall
例化,因为每次都将在服务的单独实例上处理传入的客户端请求。
ConcurrencyMode
,主要参与者,将允许您定义在给定时间可以访问服务实例的线程数。在ConcurrencyMode=Single
中,一次只有一个线程可以访问服务实例。这也取决于您是否启用了SynchronizationConext
,SynchronizationConext=true
如果您的服务正在回答另一个请求,则客户端调用将排队。因此传入的服务调用将排队,直到前面的调用被首先处理。随着ConcurrencyMode=Multiple
设置时,允许任意数量的线程访问服务实例,这意味着您的服务可以在线程池中有多少线程(与 CPU 能力直接相关)可用的情况下响应尽可能多的调用。多并发模式的问题在于,您的服务在接收和响应调用的顺序上并不那么可靠,因为默认情况下将不会管理状态,因为SynchronizationContext
默认情况下将设置为 false。MSDN 上提供了关于并发模式和线程安全的简短摘要。
这些设置在与InstanceContext
模式结合使用时会影响您的服务性能,请参阅这篇非常不错的文章,其中探讨了各种并发模式和实例上下文设置及其对性能的影响(尽管结果似乎仅在自托管环境中,可能不太代表您在 IIS 中托管时获得的时间)。
您管理服务并发性的方式将极大地影响其性能。理想情况下,您希望为您的服务提供尽可能多的线程(尝试增加 ThreadPool 的最小线程),并避免传入服务调用排队,只要您的服务有计算资源可供使用。但是过度使用多线程会牺牲状态管理和响应客户端请求的顺序。