如何知道HttpWebClientProtocol类是否是线程安全的
本文关键字:线程 安全 是否是 何知道 HttpWebClientProtocol | 更新日期: 2023-09-27 18:26:04
我读过这个问题,但答案和讨论让我自己感到困惑。
所以我决定检查一下,但我该怎么做呢?如何创建一个测试来证明HttpWebClientProtocol
class
是否为Thread Safe
?
我已经做了以下测试:
- 创建一个
HttpWebClientProtocol
来调用WS - 我自己创建WS,里面只有一个
Thread.Sleep(30000)
- 所以我创建了两个独立的
threads
来同时调用这个HttpWebClientProtocol
- 结果是:两个
threads
调用WS都没有问题。(一个thread
不需要等待第一个呼叫结束)
通过这个测试,我证明了对象ISThread Safe
和另一个问题的"正确"答案是错误的吗?
嗯。。。我有更好的测试给你。
HttpWebClientProtocol类
直接从MSDN。以下是他们对线程安全性的看法:
线程安全性
对于每个XMLWeb服务方法调用,该类的属性都被复制到WebRequest对象的新实例中。虽然您可以同时从不同的线程调用同一WebClientProtocol实例上的XML Web服务方法,但不会进行同步以确保将属性的一致快照传输到WebRequest对象。因此,如果需要修改属性并从不同的线程进行并发方法调用,则应该使用不同的XMLWeb服务代理实例或提供自己的同步。
关于螺纹安全
这不仅仅是"可用"。但这是为了确保受一个线程影响的数据/状态不会影响另一个线程的正确执行。
如果它们共享数据结构,并且这些结构在线程之间共享,则它们不是线程安全的。这个问题可能不太明显,但在多线程系统中大量使用该类的系统上,你可能会发现一些bug/异常/奇怪的行为,这些行为在开发环境中无法重现,"只会在生产中发生"。
我的朋友,不是线程安全。
关于HttpWebClientProtocol及其线程不安全的原因
虽然文档清楚地说明了能够重用HttpWebClientProtocol,但重要的是要知道,对象本身的所有属性不会持久化到在另一个线程上创建的其他请求。
这意味着,如果有两个线程在使用Credentials
属性,那么最终可能会收到一些具有不同凭据的请求。这在具有模拟的web应用程序中是不好的,在该应用程序中,可以使用不同的凭据进行请求,而您最终可能会使用其他人的数据。
但是,如果只需要设置一次初始属性,那么是的。您可以重用该实例。