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可以增加服务的吞吐量:
该客户端是多线程的,并拨打电话从多个线程服务使用相同的代理服务器.
客户端和服务之间的绑定是具有会话的绑定(例如,netTcpBinding,wsHttpBinding w/Reliable Session,netNamedPipeBinding等).
此外,这篇文章中的证据似乎与Brian的额外评论相矛盾,即WCF 序列化任何多线程请求.后显示了运行从单个客户端的多个请求同时 - 如果 ConcurrencyMode.Multiple和InstanceContextMode.PerCall使用.
有一些额外的讨论,在这里关于这种方法的性能影响,以及一些替代品.
Bri*_*eon 13
是的,它是线程安全的.但是,您应该知道WCF将CalculateSomething使用相同的ClientBase实例自动序列化从多个线程调用它时的执行.因此,如果您希望CalculateSomething同时运行,那么您将不得不重新考虑您的设计.看一下这个答案,找到为该方法创建异步API的CalculateSomething一种方法.
是的,在通道上调用方法是线程安全的(从客户端角度来看 - 服务角度取决于服务实现)。您可以从多个线程并行调用此方法。即使自动生成代理也会为您提供创建异步调用的方法。
| 归档时间: |
|
| 查看次数: |
11126 次 |
| 最近记录: |