2010-06-14 2 views
75

In meiner Anwendung habe ich eine statische Methode, die von mehreren Threads gleichzeitig aufgerufen wird. Besteht die Gefahr, dass meine Daten durcheinander geraten?C#: Was passiert, wenn eine statische Methode aus mehreren Threads aufgerufen wird?

In meinem ersten Versuch war die Methode nicht statisch und ich erstellte mehrere Instanzen der Klasse. In diesem Fall sind meine Daten irgendwie durcheinander geraten. Ich bin mir nicht sicher, wie das passiert, weil es nur manchmal passiert. Ich bin immer noch Debuggen. Aber jetzt ist die Methode statisch, ich habe bisher keine Probleme. Vielleicht ist es nur Glück. Ich weiß es nicht genau.

Antwort

74

Variablen, die in Methoden deklariert sind (mit der möglichen Ausnahme von "erfasst" Variablen) sind isoliert, so dass Sie keine inhärenten Probleme bekommen; Wenn Ihre statische Methode jedoch auf einen freigegebenen Status zugreift, sind alle Wetten deaktiviert.

Beispiele für Shared-Zustand wäre:

  • statische Felder
  • Objekte von einem gemeinsamen Cache-Speicher zugegriffen wird (nicht-serialisierten)
  • Daten über die Eingangsparameter (und Zustand für diese Objekte) erhalten wenn es möglich ist, dass mehrere Threads das gleiche Objekt berühren (s)

wenn Sie Zustand freigegeben haben, müssen Sie entweder:

  • kümmern uns nicht um den Staat zu mutieren, sobald sie freigegeben werden können (besser: unveränderliche Objekte verwenden, um Zustand darstellen, und eine Momentaufnahme des Staates in eine lokale Variable nehmen - also eher als Referenz whatever.SomeData wiederholt, lesen Sie whatever.SomeDataeinmal in eine lokale Variable, und dann nur die Variable verwenden - beachten Sie, dass dies nur für unveränderlichen Zustand hilft!)
  • synchronisieren Sie den Zugriff auf die Daten (alle Threads müssen synchronisiert werden) - entweder sich gegenseitig ausschließen oder (feiner) Reader/Writer
+1

werfen Sie einen Blick auf diese http://msdn.microsoft.com/library/c5kehkcz(VS .80) .aspx –

+1

@Diego - ist dieser Kommentar für mich oder für @Holli gedacht? –

+0

Um Holli, nur um einige praktische Informationen zu Ihrer Antwort hinzufügen. –

9

Statische Methoden sollten für mehrere Threads in Ordnung sein.

Statische Daten auf der anderen Seite können ein Problem verursachen, da versucht werden muss, auf dieselben Daten von verschiedenen Threads zuzugreifen, um sicherzustellen, dass jeweils nur ein Thread die Daten liest oder schreibt.

+0

Das Schlüsselwort hier ist die Synchronisation :-) –

+0

Lesen ist OK, um gleichzeitig zu geschehen, aber lesen und schreiben gleichzeitig führt zu unerwartetem Verhalten – Freestyle076

4

MSDN Immer sagt:

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

Edit: Wie die Jungs hier sagen, ist nicht immer der Fall ist, und klar dies gilt für Klassen auf diese Weise entworfen in der BCL, nicht auf Klassen Benutzer erstellt, wenn dies nicht gilt.

16

Ja, es ist nur Glück. ;)

Es spielt keine Rolle, ob die Methode statisch ist oder nicht, wichtig ist, ob die Daten statisch sind oder nicht.

Wenn jeder Thread über eine eigene Instanz der Klasse mit eigenen Datensätzen verfügt, besteht kein Risiko, dass Daten verwechselt werden. Wenn die Daten statisch sind, gibt es nur einen Satz von Daten, und alle Threads teilen sich die gleichen Daten, so dass es keine Möglichkeit gibt, sie nicht zu verwechseln.

Wenn Ihre Daten in separaten Instanzen immer noch verwechselt werden, liegt das wahrscheinlich daran, dass die Daten nicht wirklich voneinander getrennt sind.

Verwandte Themen