5

给定一个配置为为每个新客户端创建一个新服务实例的 WCF 双工服务 (NetTcpBinding)(请参阅模式发布-订阅),您可以获得每个服务实例的特定回调实例。由于创建了不同的实例,因此可以同时从不同的线程调用属于不同回调的方法。

  • 如果多个线程尝试在同一个回调上调用同一个方法会发生什么?
  • 如果他们尝试调用不同的方法但调用相同的回调会发生什么?
  • 我们应该管理从多个线程对这些方法的并发访问吗?在这两种情况下?

现在考虑与服务通信的客户端:为了确保客户端可以使用服务,您必须实例化一个新代理,并且为了调用服务中定义的方法,您必须调用代理的相应方法.

  • 如果多个线程试图在同一个代理实例上调用同一个方法会发生什么?
  • 如果他们尝试为同一个代理实例调用不同的方法会发生什么?
  • 我们应该管理从多个线程对这些方法的并发访问吗?在这两种情况下?
4

1 回答 1

6

大多数问题的答案取决于您如何管理服务的并发性。没有明确的答案,因为这取决于您为ConcurrencyModeand设置的内容InstanceContextMode。WCF 的并发管理将使您能够微调服务的线程行为和性能。MSDN 上提供了有关并发管理的冗长而艰巨(但非常详细)的阅读。

InstanceContextMode允许您定义应如何实例化您的服务。对于执行大量繁重工作并处理大量调用的服务,一般的想法是使用实PerCall​​例化,因为每次都将在服务的单独实例上处理传入的客户端请求。

ConcurrencyMode,主要参与者,将允许您定义在给定时间可以访问服务实例的线程数。在ConcurrencyMode=Single中,一次只有一个线程可以访问服务实例。这也取决于您是否启用了SynchronizationConextSynchronizationConext=true如果您的服务正在回答另一个请求,则客户端调用将排队。因此传入的服务调用将排队,直到前面的调用被首先处理。随着ConcurrencyMode=Multiple设置时,允许任意数量的线程访问服务实例,这意味着您的服务可以在线程池中有多少线程(与 CPU 能力直接相关)可用的情况下响应尽可能多的调用。多并发模式的问题在于,您的服务在接收和响应调用的顺序上并不那么可靠,因为默认情况下将不会管理状态,因为SynchronizationContext默认情况下将设置为 false。MSDN 上提供了关于并发模式和线程安全的简短摘要。

这些设置在与InstanceContext模式结合使用时会影响您的服务性能,请参阅这篇非常不错的文章,其中探讨了各种并发模式和实例上下文设置及其对性能的影响(尽管结果似乎仅在自托管环境中,可能不太代表您在 IIS 中托管时获得的时间)。

您管理服务并发性的方式将极大地影响其性能。理想情况下,您希望为您的服务提供尽可能多的线程(尝试增加 ThreadPool 的最小线程),并避免传入服务调用排队,只要您的服务有计算资源可供使用。但是过度使用多线程会牺牲状态管理和响应客户端请求的顺序。

于 2012-07-04T18:09:53.027 回答