c# - .NET WSE 客户端 stub 是线程安全的吗?

标签 c# .net web-services multithreading wse

.NET WSE 线程安全地从 WSDL 生成客户端 stub 吗?

当然,“线程安全”不一定是一个严格定义的术语,所以我至少对以下内容感兴趣:

同一个 stub 类的不同实例是否可由不同线程同时访问,具有与单线程执行相同的有效行为?

同一 stub 类的单个实例是否可由不同线程同时访问,具有与在单线程执行中以某种任意方式交错的相同调用相同的有效行为?

您可能还希望使用描述的术语 here (并发起 here )来更准确地讨论这个问题。

最佳答案

好吧,简短的回答是线程安全吗,是的。原因是服务的服务器端比客户端连接在线程功能方面有更多的发言权。客户端只是一个代理,它以服务器可以理解的方式布置请求。它什么都不知道。它是一个基本类,除了连接到服务器之外没有外部访问。因此,只要服务器允许多个连接就可以了。因此没有资源争用(除了服务器能够处理您的所有请求)。

在客户端,您可以让多个线程使用相同的类但使用不同的实例。这可能是首选方案,以便每个事务都可以是原子的。而共享实例则必须围绕类本身的访问处理自己的线程锁定,否则您可能会在代码内部资源上遇到竞争条件。

还有异步调用的能力。 wsdl 工具生成的 stub 将创建开始、结束调用方法,以便您可以提供回调方法来有效地允许您提交请求并继续您的代码,而无需等待回复。这可能是您使用单个实例的第二个场景的最佳选择。

然而,这也取决于服务器组件的编码方式。如果它是一个网络服务,你应该能够同时提交多个请求。但是,如果它是基于套接字的服务,您可能需要在您的一端进行一些额外的编码,以处理多个传入连接,甚至创建套接字。

所以简而言之,在服务器端能够处理多个并发连接的范围内,不同实例的行为与单线程执行相同。

至于单实例,如果你使用回调过程,只要你能够得到你想要的东西而不会太头疼。但是,它也受限于服务器端代码的限制。

我声明服务器限制的原因是,有些公司将构建网络服务,限制来自出站主机的连接数量,因此您的吞吐量受此限制。因此,您可以使用的有效线程数将减少或被淘汰。

关于c# - .NET WSE 客户端 stub 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950088/

相关文章:

c# - 访问 null 对象的属性时,是否有方便的语法返回 null 而不是异常

python - 如何在 Python 中创建 IntPtr?

.net - SQL Server Compact Edition 是 SQLite 的合理替代品吗?

html - 我可以制作不可下载的视频流吗(通过使用代码中的技巧)

c# - Unity 等价于 Ninject 的 Bind.ToMethod of IPrincipal,IIdentity

c# - 如何使用 c# 将 system.io 流对象输入到 ffmpeg

c# - 暂停线程

c# - 只读指定span

java - 如何在 Java Web 服务 SOAP 中注入(inject) EJB

Java Web 服务 - 是否需要 Axis?