Webclient的IWebProxy是线程安全的吗?

时间:2010-10-04 09:46:49

标签: .net webclient

使用WebClient下载数据时,每次解析代理时似乎都会产生一些轻微但可感知的延迟。因为我需要在不同的线程中多次使用webclient调用方法,而webclient本身不是线程安全的,我想的是每次只创建一个新的webclient并将其代理设置为预先初始化的IWebProxy

但IWebProxy是否是线程安全的,所以我可以做到这一点并且有可能有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您在.NET中看到代理查找导致性能下降,请参考以下几种方法:

  1. 使用特定代理主机构建WebProxy对象,而不是依赖.NET来使用Web代理自动发现,这可能会导致您看到的速度变慢。这在服务器方案中是可行的,例如,您可以将代理服务器放在配置文件中而忘记它。在您不提前知道代理的客户端应用程序中,它是不可行的。
  2. 在您自己的IWebProxy实现中包装WebProxy对象,并在每个interace方法和属性周围放置一个lock(this){ }。如果您事先无法知道代理或设置特定代理对您的性能问题没有帮助,请执行此操作。
  3. 您可以随时下载.NET Framework Reference Source并查看WebProxy实现源代码,看看它是否真的是线程安全的,尽管有文档。我不会建议这个选项,但是为了完整性我在这里包括它。
  4. 更多信息:

    接口(如IWebProxy)既不是线程安全的,也不是线程不安全的。它们下面的实现(如WebProxy类)决定了线程的安全性。

    也就是说,WebProxy不是线程安全的。根据{{​​3}}:

      

    线程安全

         

    任何公共静态(在Visual中共享)   基本)这种类型的成员是线程   安全。任何实例成员都不是   保证是线程安全的。

    BTW,以上(静态是线程安全的,实例方法/属性不是)对于.NET Framework中的几乎所有类来说通常都是正确的。因此,除非您看到文档说实例方法是线程安全的,否则您应该假设实例方法/属性不是线程安全的。