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

时间:2015-12-08 15:12:18

标签: c#

我看了this个问题,但答案和讨论让我自己感到困惑。

所以我决定检查,但我怎么能这样做?如何创建测试以证明HttpWebClientProtocol class是否为Thread Safe

我已经完成了以下测试:

  1. 创建一个HttpWebClientProtocol来调用WS。
  2. 我自己创建了WS,里面只有一个Thread.Sleep(30000)
  3. 因此,我创建了两个独立的threads来同时调用此HttpWebClientProtocol
  4. 结果是:两个threads都没有问题地调用WS。 (一个thread无需等待第一个通话结束)
  5. 通过此测试,我证明了对象 IS Thread Safe和"正确'回答另一个问题是错误的?

1 个答案:

答案 0 :(得分:2)

嗯......我对你有更好的考验。

HttpWebClientProtocol Class

直接来自MSDN。这是他们对线程安全所说的副本/面食:

  

线程安全

     

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

关于线程安全

这不仅仅是“可用”。但它是关于确保受一个线程影响的数据/状态不会影响另一个线程的正确执行。

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

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

关于HttpWebClientProtocol以及为什么它不是线程安全的

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

这意味着如果您有2个线程正在使用Credentials属性,那么最终可能会出现一些具有不同凭据的请求。这在使用模拟的Web应用程序中会很糟糕,其中请求可以使用不同的凭据进行,并且您最终可能会获得其他人的数据。

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