Безопасно ли использовать один и тот же CookieContainer для нескольких запросов HttpWebRequest? - PullRequest
4 голосов
/ 28 марта 2012

Я выполняю своего рода WebCrawler, и мне нужно сохранять состояние Cookie между запросами.

Я загружаю все страницы асинхронно, создавая новые экземпляры HttpWebRequest, но устанавливая тот же CookieContainer.На страницах можно писать и читать куки.

Могу ли я сделать это безопасно?Есть какая-нибудь альтернатива, которая не подклассирует CookieContainer и не ставит блокировки на все методы?

MSDN говорит, что этот класс не является поточно-ориентированным, но на практике я могу это сделать?

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Согласно документации :

Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными.Ни один из членов экземпляра не гарантированно является потокобезопасным.

Таким образом, вы должны обеспечить правильную блокировку, если вы хотите совместно использовать один и тот же экземпляр между несколькими потоками.Но поскольку членами класса CookieContainer фактически не манипулирует ваш код, а неявно из разных созданных вами экземпляров HttpWebRequest, не может быть легко синхронизироваться должным образом, за исключением, конечно, блокировки ваших запросов, что, конечно, отчастипобеждает цель и уровень параллелизма, которого, я полагаю, вы пытаетесь достичь здесь.

На практике вы столкнетесь с проблемами - это другая тема.Дело в том, что документация (и, следовательно, автор) не дает никаких гарантий.

0 голосов
/ 20 июня 2017

На самом деле, если вы посмотрите на исходный код CookieContainer здесь . Похоже, что он потокобезопасен, несмотря на документацию.

Хороший ответ, который это объясняет.

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

Вы заметите, что автор CookieContainer позаботился об использовании lock {} и SyncRoot во всех этих изменяющих коллекцию частях кода, и я не думаю, что такой подход не адресован параллельным сценариям.

Итак, по общему правилу

Когда вы видите стандартную документацию Any instance members are not guaranteed to be thread safe., не останавливайтесь на достигнутом и устанавливайте блокировку самостоятельно. Воспользуйтесь отражением или referenceource.microsoft.com (для классов .NET), чтобы узнать, являются ли они потокобезопасными или нет.

...