如何知道HttpWebClientProtocol类是否是线程安全的

本文关键字:线程 安全 是否是 何知道 HttpWebClientProtocol | 更新日期: 2023-09-27 18:26:04

我读过这个问题,但答案和讨论让我自己感到困惑。

所以我决定检查一下,但我该怎么做呢?如何创建一个测试来证明HttpWebClientProtocol class是否为Thread Safe

我已经做了以下测试:

  1. 创建一个HttpWebClientProtocol来调用WS
  2. 我自己创建WS,里面只有一个Thread.Sleep(30000)
  3. 所以我创建了两个独立的threads来同时调用这个HttpWebClientProtocol
  4. 结果是:两个threads调用WS都没有问题。(一个thread不需要等待第一个呼叫结束)

通过这个测试,我证明了对象ISThread Safe和另一个问题的"正确"答案是错误的吗?

如何知道HttpWebClientProtocol类是否是线程安全的

嗯。。。我有更好的测试给你。

HttpWebClientProtocol类

直接从MSDN。以下是他们对线程安全性的看法:

线程安全性

对于每个XMLWeb服务方法调用,该类的属性都被复制到WebRequest对象的新实例中。虽然您可以同时从不同的线程调用同一WebClientProtocol实例上的XML Web服务方法,但不会进行同步以确保将属性的一致快照传输到WebRequest对象。因此,如果需要修改属性并从不同的线程进行并发方法调用,则应该使用不同的XMLWeb服务代理实例或提供自己的同步。

关于螺纹安全

这不仅仅是"可用"。但这是为了确保受一个线程影响的数据/状态不会影响另一个线程的正确执行。

如果它们共享数据结构,并且这些结构在线程之间共享,则它们不是线程安全的。这个问题可能不太明显,但在多线程系统中大量使用该类的系统上,你可能会发现一些bug/异常/奇怪的行为,这些行为在开发环境中无法重现,"只会在生产中发生"。

我的朋友,不是线程安全。

关于HttpWebClientProtocol及其线程不安全的原因

虽然文档清楚地说明了能够重用HttpWebClientProtocol,但重要的是要知道,对象本身的所有属性不会持久化到在另一个线程上创建的其他请求。

这意味着,如果有两个线程在使用Credentials属性,那么最终可能会收到一些具有不同凭据的请求。这在具有模拟的web应用程序中是不好的,在该应用程序中,可以使用不同的凭据进行请求,而您最终可能会使用其他人的数据。

但是,如果只需要设置一次初始属性,那么是的。您可以重用该实例。