2009-12-23 25 views
3

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

当然,“线程安全”是没有必要的严格定义的术语,所以我至少喜欢下面:

都可以访问相同的stub类的不同情况下同时通过不同线程,具有与单线程执行相同的有效行为?

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

您也可以使用描述为here(和原始here)的术语来更精确地讨论此问题。

回答

2

那么,对于线程安全的简短答案是肯定的。原因是服务器的服务器端将有更多的话要说客户端连接的线程能力。客户端只是一个以服务器可以理解的方式布置请求的代理。它一无所知。这是一个基本的类,除了与服务器的连接以外,没有外部访问。所以只要服务器允许多个连接,你会没事的。因此没有资源争用(除了服务器能够处理你的所有请求)。

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

还有一种异步调用的能力。由wsdl工具生成的存根将创建begin,end invoke方法,以便您可以提供回调方法,以便有效地允许您提交请求并继续执行代码而不用等待回复。这可能是您的第二个场景中单个实例的最佳选择。

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

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

至于单一实例,如果您使用回调过程,这是提供您可能能够得到你以后没有太多头痛。但是,它也受限于服务器端代码的限制。

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