2012-03-28 3 views
4

Ich mache eine Art WebCrawler und ich muss den Cookie-Status zwischen den Anforderungen persistieren.Ist es sicher, denselben CookieContainer für mehrere HttpWebRequests zu verwenden?

Ich lade alle Seiten async, die neue HttpWebRequest-Instanzen erstellen, aber den gleichen CookieContainer festlegen. Die Seiten können Cookies schreiben und lesen.

Kann ich es sicher machen? Gibt es eine Alternative, die CookieContainer nicht Unterklasse und Sperren auf alle Methoden setzen?

Die MSDN sagt, dass diese Klasse nicht Thread sicher ist, aber in der Praxis kann ich es tun?

+0

Sicher in welcher Weise? –

+0

Es klingt, als ob Sie über Thread-Sicherheit sprechen (basierend auf Ihrer Verwendung von _locks_), ist das richtig? –

+0

Ja, über Thread Sicherheit –

Antwort

4

Nach dem documentation:

Alle öffentlichen static (Shared in Visual Basic) Member dieses Typs sind Thread-sicher. Alle Instanzmitglieder sind nicht garantiert, Thread sicher zu sein.

Sie sollten also sicherstellen, ordnungsgemäße Sperren, wenn Sie die gleiche Instanz zwischen mehreren Threads teilen möchten. Aber da die Mitglieder der Klasse CookieContainer eigentlich nicht von Ihrem Code manipuliert werden, sondern implizit von den verschiedenen HttpWebRequest-Instanzen, die Sie erstellt haben, könnte es nicht einfach sein, sie korrekt zu synchronisieren, abgesehen von der Sperrung Ihrer Anfragen, die natürlich die Zweck und die Ebene der Parallelität, die Sie hier versuchen zu erreichen.

Ob in der Praxis Sie Probleme bekommen, ist ein anderes Thema. Die Sache ist, dass die Dokumentation (und damit der Autor) keine Garantien gibt.

0

Eigentlich, wenn Sie den Quellcode von CookieContainerhere betrachten. Es scheint, dass es trotz der Dokumentation threadsicher ist.

Eine nette Antwort, die es erklärt.

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

Sie werden bemerken, dass der Autor von Cookie Pflege Sperre der Verwendung nahm {} und SyncRoot alle um diese Sammlung wechselnden Teile des Codes, und ich glaube nicht, dass ein solcher Ansatz ist nicht an gleichzeitige Szenarien adressiert.

So, als allgemeine Regel

Wenn Sie die Standard-Any instance members are not guaranteed to be thread safe. Dokumentation zu sehen, nicht stoppen nur da und implementieren ein Schloss selbst. Verwenden Sie reflectionource.microsoft.com (für .NET-Klassen), um herauszufinden, ob sie threadsicher sind oder nicht.