In meiner Anwendung habe ich eine statische Methode, die von mehreren Threads gleichzeitig aufgerufen wird. Besteht die Gefahr, dass meine Daten verwechselt werden?
Bei meinem ersten Versuch war die Methode nicht statisch und ich habe mehrere Instanzen der Klasse erstellt. In diesem Fall wurden meine Daten irgendwie verwechselt. Ich bin mir nicht sicher, wie das passiert, weil es nur manchmal passiert. Ich debugge immer noch. Aber jetzt ist die Methode statisch. Ich habe bisher keine Probleme. Vielleicht ist es nur Glück. Ich weiß es nicht genau.
c#
multithreading
static
TalkingCode
quelle
quelle
Antworten:
In Methoden deklarierte Variablen (mit der möglichen Ausnahme von " erfassten " Variablen) sind isoliert, sodass keine inhärenten Probleme auftreten. Wenn Ihre statische Methode jedoch auf einen freigegebenen Status zugreift, sind alle Wetten deaktiviert.
Beispiele für einen gemeinsamen Zustand wären:
Wenn Sie einen gemeinsamen Status haben, müssen Sie entweder:
whatever.SomeData
wiederholt referenzieren , lesen Siewhatever.SomeData
einmal in eine lokale Variable und dann benutze einfach die Variable - beachte, dass dies nur für den unveränderlichen Zustand hilft!)quelle
Ja, es ist nur Glück. ;)
Es spielt keine Rolle, ob die Methode statisch ist oder nicht. Entscheidend ist, ob die Daten statisch sind oder nicht.
Wenn jeder Thread eine eigene Instanz der Klasse mit einem eigenen Datensatz hat, besteht keine Gefahr, dass Daten verwechselt werden. Wenn die Daten statisch sind, gibt es nur einen Datensatz, und alle Threads verwenden dieselben Daten, sodass es keine Möglichkeit gibt, sie nicht zu verwechseln.
Wenn Ihre Daten in separaten Instanzen immer noch verwechselt werden, liegt dies höchstwahrscheinlich daran, dass die Daten nicht wirklich getrennt sind.
quelle
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Nur um hinzuzufügen, die lokalen Variablen, die im Rahmen einer statischen Methode deklariert wurden, bilden nicht den Teil der Daten, um den wir uns im gegebenen Szenario kümmern müssen.Statische Methoden sollten für mehrere Threads in Ordnung sein.
Statische Daten können andererseits ein Problem verursachen, da Versuche, von verschiedenen Threads auf dieselben Daten zuzugreifen, gesteuert werden müssen, um sicherzustellen, dass jeweils nur ein Thread die Daten liest oder schreibt.
quelle
MSDN sagt immer:
Bearbeiten: Wie die Jungs hier sagen, ist dies nicht immer der Fall, und dies gilt eindeutig für Klassen, die auf diese Weise in der BCL entworfen wurden, nicht für vom Benutzer erstellte Klassen, für die dies nicht gilt.
quelle