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

时间:2009-12-23 00:38:05

标签: c# .net web-services multithreading wse

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

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

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

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

您可能还希望使用here(和原始here)描述的术语来更精确地讨论这个术语。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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