繁体   English   中英

.NET WSE客户端存根是否是线程安全的?

[英]Are .NET WSE client stubs thread-safe?

客户端存根是否由.NET WSE线程安全的WSDL生成?

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

不同线程可以同时访问同一存根类的不同实例,具有与单线程执行相同的有效行为吗?

同一个存根类的单个实例是否可以由不同的线程并发访问,并且在单线程执行中以相同的方式交错相同的有效行为?

您可能还希望使用此处描述的术语(并在此处起源)来更精确地讨论这一术语。

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

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

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

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

因此,简而言之,不同的实例与服务器端限制内的单线程执行行为相同,能够处理多个并发连接。

至于单个实例,如果你使用回调过程,这可以让你得到你想要的东西而不用太多头痛。 但是,它也受限于服务器端代码的限制。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM