跨多个HttpWebRequests使用相同的CookieContainer是否安全?

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

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

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

MSDN说这个类不是线程安全的,但在实践中,我能做到吗?

根据文件 :

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

因此,如果要在多个线程之间共享同一实例,则应确保正确锁定。 但是,由于CookieContainer类的成员实际上并未被您的代码操纵,而是隐式地从您创建的不同HttpWebRequest实例中进行操作,因此无法轻松地正确同步,除了当然锁定您的请求当然会失败目的和我认为你想在这里实现的并行度。

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

实际上,如果你在这里查看 CookieContainer的源代码。 尽管有文档,它似乎是线程安全的。

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

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

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

所以,作为一般规则

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