WCF ClientBase线程安全吗?

Hna*_*nas 30 wcf multithreading

我已经实现了ClientBase以使用WCF连接到服务.然后,我在通道上调用一种方法与服务进行通信.

base.Channel.CalculateSomething();
Run Code Online (Sandbox Code Playgroud)

这个调用线程是安全的还是应该在运行多个线程时锁定它?

谢谢

Lar*_*ann 15

对这里答案的后续评论也让我不确定,所以我做了一些挖掘.以下是一些ClientBase<T>线程安全的可靠证据- 本博客文章讨论了如何在多个线程同时使用单个客户端代理的情况下使WCF服务正常运行(大胆强调在原文中):

...但是,如果满足以下条件,则可能会在PerCall服务上将ConcurrencyMode设置为Multiple可以增加服务的吞吐量:

  1. 客户端是多线程的,并拨打电话从多个线程服务使用相同的代理服务器.

  2. 客户端和服务之间的绑定是具有会话的绑定(例如,netTcpBinding,wsHttpBinding w/Reliable Session,netNamedPipeBinding等).

此外,这篇文章中的证据似乎与Brian的额外评论相矛盾,即WCF 序列化任何多线程请求.后显示了运行从单个客户端的多个请求同时 - 如果 ConcurrencyMode.MultipleInstanceContextMode.PerCall使用.

有一些额外的讨论,在这里关于这种方法的性能影响,以及一些替代品.

  • _虽然通道和由通道创建的客户端是线程安全的,但它们可能不支持同时向网络写入多个消息。_来源:[MS docs](https://docs.microsoft.com/zh-cn/dotnet /framework/wcf/feature-details/middle-tier-client-applications?view=netframework-4.7.1) (2认同)

Bri*_*eon 13

是的,它是线程安全的.但是,您应该知道WCF将CalculateSomething使用相同的ClientBase实例自动序列化从多个线程调用它时的执行.因此,如果您希望CalculateSomething同时运行,那么您将不得不重新考虑您的设计.看一下这个答案,找到为该方法创建异步API的CalculateSomething一种方法.

  • 这意味着WCF将以顺序方式一个接一个地进行调用,而不是同时进行调用(尽管从编程的角度看它们似乎是这样做的). (4认同)
  • 你能解释一下你的意思吗?"但是,你应该知道,当使用相同的ClientBase实例从多个线程调用时,WCF会自动序列化CalculateSomething的执行." 谢谢! (2认同)
  • 您有什么证据或理由说它是线程安全的?以及您如何知道CalculateSomething是自动序列化的:它是由客户端ClientBase实例还是在服务器/实现端进行序列化的?我问是因为[MSDN上的ClientBase类]的结尾(http://msdn.microsoft.com/en-us/library/ms576141%28v=vs.110%29.aspx)表示不是线程安全的。 (2认同)

Lad*_*nka 3

是的,在通道上调用方法是线程安全的(从客户端角度来看 - 服务角度取决于服务实现)。您可以从多个线程并行调用此方法。即使自动生成代理也会为您提供创建异步调用的方法。

  • 在过去的两年里,您是否将“*坚信*”和“*希望*”改为“*知道*”?最好有一个明确指出这一点的主要来源(如果有的话)。 (2认同)