9
  1. Ist die Klasse .NET System.Net.CookieContainer sicher? - Update: Turnkey geantwortet--
  2. Gibt es eine Möglichkeit, Thread-Sicherheit für Variablen zu gewährleisten, die während asynchronen Anforderungen (dh. HttpWebRequest.CookieContainer) geändert werden?
  3. Gibt es ein Attribut zum Hervorheben von threadsicheren Klassen? - Update: Wenn Thread-Sicherheit auf MSDN beschrieben wird, dann haben sie wahrscheinlich kein Attribut dafür -
  4. Sind alle .NET-Klassen Thread sicher? - Update: Marc answered--

Ich stelle diese Fragen, weil ich die Cookie in asynchronen Anforderungen in einem multithreaded Code verwenden. Und ich kann keine asynchrone Anfrage in eine Sperre stellen. Vielleicht muss ich readonly "Variablen" (oder unveränderliche Typen) wie in F # verwenden, richtig?Ist .NET System.Net.CookieContainer threadsicher?

+0

Ich werde die zweite aktualisieren, nur um alles abzuhaken ... –

Antwort

4

Nein, nicht alle .NET-Klassen sind Thread-sicher. In der Tat, sehr wenige müssen sein. Im Allgemeinen sollten statische Elemente Thread-sicher sein, aber das ist es.

Unveränderliche/semi-unveränderbare Objekte sind automatisch threadsicher (dies schließt Dinge wie XslTransform usw. ein) - und es gibt ein paar veränderbare Fälle (wie Threading-Container), in denen man erwarten kann, dass Threads sicher sind. MSDN gibt Thread-Sicherheit für jede Klasse an.

würde ich keine Erwartung für einen Cookie-Container haben Thread-sicher zu sein, so dass Sie wahrscheinlich diese Texte selbst synchronisieren müssen.

(aktualisiert)

Re Ihren zweiten Punkt; An welche Variablen denkst du gerade? Ihre eigenen lokalen Statusvariablen werden während der Async-Anfrage nicht direkt aktualisiert, sodass es für Sie einfach ist, den Zugriff zu synchronisieren, wenn Sie bei der Verarbeitung von Anfragen auf die Verarbeitung von Antworten achten. Am häufigsten über eine Monitor - dh

lock(syncLock) { 
    // prepare request from (synchronized) state 
    req.Begin{...} 
} 

und dann in der Callback-

lock(syncLock) { 
    // ...read values from request... 
    // ...update local state... 
} 

Wo syncLock ist nur ein Sperrobjekt (vielleicht für eine Instanz gehalten):

private readonly object syncLock = new object(); 
+0

Ich weiß nicht genau, an welchem ​​Punkt HttpWebRequest.CookieContainer aktualisiert wird, aber ich denke, es ist während der asynchronen Anfrage. –

+0

Nun, müssen Sie gleichzeitige Anfragen von demselben Objekt machen? Können Sie nicht mehrere HttpWebRequest-Objekte mit separaten Cookie-Containern haben? dann gibt es keinen Konflikt. –

5

Vom horses mouth:

Thema Sicherheit

Alle öffentlichen static (Shared in Visual Basic) Member dieses Typs sind threadsicher. Es ist nicht garantiert, dass alle Instanzmitglieder Thread-sicher sind.

Edit:

Sie eine Sperre um Aktionen setzen könnte, dass die Instanzmitglieder ändern.

0

Alle Statische Klassen im .NET-Framework werden von Microsoft als threadsicher eingestuft.

Sie können dies überprüfen, indem Sie Reflektor verwenden.

1

Nur ein Hinweis, eine Webseite sendet eine modifizierte Cookie-Liste als Teil ihrer HTTP-Antwort. Wenn Sie den CookieContainer nach dem Senden der Antwort ändern, wird nichts erreicht. Sie ändern lediglich die Cookie-Sammlung einer Seitenanforderung, die nicht mehr existiert.

2

Wie ich sehe (mit Hilfe des Reflektors), CookieContainer intern verwendet Sperren für den Zugriff auf seine Mitglieder, so sollte es Thread trotz der Dokumentation sicher sein.

Übrigens hat es keine öffentlichen statischen Mitglieder überhaupt. So scheint es mir, dass die Dokumentation nur eine Standard-Ankündigung bietet.

+0

Und hier für .net Kern ... https://github.com/dotnet/corefx/blob/1c3a3e6aad27daf3ce53edcae1022b69ef31866c/src/System.Net.Primitives/src/System/Net/CookieContainer.cs –