2012-03-28 54 views
4

我正在做一种WebCrawler,我需要在请求之间坚持Cookie状态。在多个HttpWebRequests中使用相同的CookieContainer是否安全?

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

我可以安全地做到吗?有没有替代方案不是继承CookieContainer并将所有方法都锁定?

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

+0

以什么方式安全? – 2012-03-28 16:27:49

+0

听起来好像你在谈论线程安全(基于你对_locks_的使用),这是否正确? – 2012-03-28 16:34:03

+0

是的,关于线程安全 – 2012-03-29 10:21:02

回答

4

按照documentation

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

因此,如果您想在多个线程之间共享相同的实例,则应确保正确锁定。但是由于CookieContainer类的成员实际上不是由您的代码操纵的,而是隐式地来自您创建的不同HttpWebRequest实例,所以它不会很容易同步正确,除了锁定您的请求,当然这会阻止目的和我认为你想在这里实现的并行性水平。

无论在实践中你会得到的问题是另一个话题。问题是文档(也就是作者)没有提供任何保证。

0

其实,如果你看看CookieContainerhere的源代码。看起来,尽管有文档,它仍然是线程安全的。

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

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

你会注意到的CookieContainer的作者使用了锁{}和SyncRoot上周围所有的代码,这些集合变化部分的照顾,我不认为这样的做法是不适用于并发场景。

所以,作为一般规则

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

相关问题