【问题标题】:Is it safe to use the same CookieContainer across multiple HttpWebRequests?跨多个 HttpWebRequest 使用相同的 CookieContainer 是否安全?
【发布时间】:2012-03-28 16:22:13
【问题描述】:

我正在做一种 WebCrawler,我需要在请求之间保持 Cookies 状态。

我异步下载所有页面,创建新的 HttpWebRequest 实例,但设置相同的 CookieContainer。页面可以写入和读取 cookie。

我可以安全地做吗?是否有任何替代方法不是 CookieContainer 的子类并在所有方法中加锁?

MSDN 说这个类不是线程安全的,但实际上,我可以这样做吗?

【问题讨论】:

  • 听起来你在谈论线程安全(基于你对的使用),对吗?
  • 是的,关于线程安全

标签: c# httpwebrequest thread-safety web-crawler webclient


【解决方案1】:

根据documentation

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

因此,如果您想在多个线程之间共享同一个实例,您应该确保正确锁定。但是由于 CookieContainer 类的成员实际上并没有被您的代码操纵,而是隐含地从您创建的不同 HttpWebRequest 实例中正确同步,当然除了锁定您的请求之外,这当然是一种违背了我想您在这里尝试实现的目的和并行度。

在实践中你是否会遇到问题是另一个话题。问题是文档(以及作者)没有为您提供任何保证。

【讨论】:

    【解决方案2】:

    其实看CookieContainerhere的源码。尽管有文档,但它似乎是线程安全的。

    一个很好的答案来解释它。

    https://stackoverflow.com/a/18370195/5088793

    您会注意到 CookieContainer 的作者在代码的这些更改集合的部分周围使用了 lock {} 和 SyncRoot,我认为这种方法不适用于并发场景。

    所以,一般来说

    当您看到标准的Any instance members are not guaranteed to be thread safe. 文档时,不要只是停在那里并自己实现锁定。使用反射或 referencesource.microsoft.com(对于 .NET 类)来确定它们是否是线程安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多