我正在做一种WebCrawler,我需要在请求之间保持Cookies状态。
我下载所有页面异步创建新的HttpWebRequest实例,但设置相同的CookieContainer。页面可以写入和读取cookie。
我能安全地做到吗?有没有任何替代方法不是将CookieContainer子类化并将锁定放在所有方法中?
MSDN说这个类不是线程安全的,但在实践中,我能做到吗?
答案 0 :(得分:4)
此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。任何实例成员都不能保证是线程 安全
因此,如果要在多个线程之间共享同一实例,则应确保正确锁定。但是由于CookieContainer
类的成员实际上并没有被你的代码操纵,而是隐式地从你创建的不同的HttpWebRequest实例中进行正确的同步,这当然不能锁定你的请求当然有点挫败了我想你想在这里实现的目的和并行度。
在实践中,你是否会遇到问题是另一个话题。问题在于文档(以及作者)并没有为您提供任何保证。
答案 1 :(得分:0)
实际上,如果您查看CookieContainer
here的源代码。尽管有文档,它似乎是线程安全的。
一个很好的答案解释了它。
https://stackoverflow.com/a/18370195/5088793
你会注意到CookieContainer的作者负责在代码的这些收集更改部分周围使用lock {}和SyncRoot,我不认为这种方法不是针对并发的场景。
所以,作为一般规则
当您看到标准Any instance members are not guaranteed to be thread safe.
文档时,请不要停在那里并自行实施锁定。使用reflection或referencesource.microsoft.com(对于.NET类)来确定它们是否是线程安全的。