我正在做一种WebCrawler,我需要在请求之间坚持Cookie状态。在多个HttpWebRequests中使用相同的CookieContainer是否安全?
我下载所有页面异步创建新的HttpWebRequest实例,但设置相同的CookieContainer。页面可以写入和读取cookie。
我可以安全地做到吗?有没有替代方案不是继承CookieContainer并将所有方法都锁定?
MSDN说这个类不是线程安全的,但在实践中,我能做到吗?
我正在做一种WebCrawler,我需要在请求之间坚持Cookie状态。在多个HttpWebRequests中使用相同的CookieContainer是否安全?
我下载所有页面异步创建新的HttpWebRequest实例,但设置相同的CookieContainer。页面可以写入和读取cookie。
我可以安全地做到吗?有没有替代方案不是继承CookieContainer并将所有方法都锁定?
MSDN说这个类不是线程安全的,但在实践中,我能做到吗?
任何公共静态此类型的成员(在Visual Basic中的Shared)是 线程安全的。任何实例成员不保证是线程 安全。
因此,如果您想在多个线程之间共享相同的实例,则应确保正确锁定。但是由于CookieContainer
类的成员实际上不是由您的代码操纵的,而是隐式地来自您创建的不同HttpWebRequest实例,所以它不会很容易同步正确,除了锁定您的请求,当然这会阻止目的和我认为你想在这里实现的并行性水平。
无论在实践中你会得到的问题是另一个话题。问题是文档(也就是作者)没有提供任何保证。
其实,如果你看看CookieContainer
here的源代码。看起来,尽管有文档,它仍然是线程安全的。
一个很好的答案,解释它。
https://stackoverflow.com/a/18370195/5088793
你会注意到的CookieContainer的作者使用了锁{}和SyncRoot上周围所有的代码,这些集合变化部分的照顾,我不认为这样的做法是不适用于并发场景。
所以,作为一般规则
当你看到标准Any instance members are not guaranteed to be thread safe.
文档,不只是停在那里,并实现自己的锁。使用反射或referencesource.microsoft.com(对于.NET类)来确定它们是否是线程安全的。
以什么方式安全? – 2012-03-28 16:27:49
听起来好像你在谈论线程安全(基于你对_locks_的使用),这是否正确? – 2012-03-28 16:34:03
是的,关于线程安全 – 2012-03-29 10:21:02