2010-12-23 3 views
4

Hallo Ich arbeite an einer einfachen Desktop-Anwendung, muss es einige Operationen wie das Laden einer Webseite, die den Haupt-Thread blockieren können, so verschoben ich den Code zu ein Hintergrundarbeiter.Ist es sicher, C# globale Variablen in einem Hintergrund-Worker-Thread

Mein Problem ist, gibt es eine schwere Klasse namens UCSProject, die viele String-und List-Felder enthält, muss ich eine Instanz dieser Klasse an den Hintergrund-Arbeiter übergeben, da die Klasse ein bisschen schwer ist, möchte ich reduzieren die Anzahl der doppelten Instanzen, indem Sie die globale Variable direkt verwenden, anstatt sie als Argument an den Hintergrund-Worker zu übergeben.

Um es kurz zu machen, ich will nur wissen, ist es sicher, globale Variablen aus einem Hintergrund-Worker-Thread in C#

+1

Es klingt wie (vielleicht) Ihre UCSProject-Klasse sollte irgendwie aufgebrochen werden, ohne einen großen Einblick in den Inhalt von etc, vielleicht wäre einige Refactoring vorteilhafter? Es klingt für mich wie die falschen Fragen. – Dave

Antwort

5

Es ist sicher, es sei denn bis beide Ihre Gewinde (Hintergrund & normal) das Objekt nicht ändern.

Wenn Sie Ihr Objekt möchten, indem Sie einander geändert werden, verwenden Lock

+0

Ich habe nicht die Absicht, irgendwelche Werte in der Klasse zu ändern, Vielen Dank – Vamsi

+0

Bin froh, dass es geholfen .. :) – RameshVel

1

Es ist sicher zuzugreifen, aber Sie haben Zugriff auf die Variablen zu synchronisieren, z.B. indem Sie die lock Anweisung verwenden.

Siehe "lock Statement" in der MSDN-Bibliothek.

1

Nein, es ist nicht, wenn Sie es mit lock(object) { } Verriegelung sind, wenn Sie eine ihrer Datenfelder verwenden.

+0

Vielen Dank – Vamsi

3

Durch Ihre Frage vermute ich, dass Sie nicht verstehen, wie Variablen für Klassen arbeiten. Sie benötigen keine globale Variable, um nur eine Kopie Ihres Objekts zu haben. Alle Variablen zeigen auf genau das gleiche Objekt, es sei denn Sie Clone es oder erstellen Sie ein neues mit dem alten als Prototyp.

Eine globale Variable ändert also nichts, es sei denn, Sie erstellen explizit neue Kopien, wie im vorherigen Abschnitt beschrieben.

Ich frage mich auch, wie schwer Ihre Klasse sein kann, wenn Sie denken, dass die Leistung verletzt würde, indem Sie Kopien davon schaffen? Wie viel mb wiegt es?

aktualisieren

Diese Artikelserie beschreibt im Detail, was der Heap und Stack: http://www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory01122006130034pm/csharp_memory.aspx

+0

Ich kann keine genaue Zahl auf das Gewicht geben, weil es enthält ein paar Listen Felder, deren Werte basierend auf der Benutzereingabe zugeordnet werden, die in einigen KB laufen kann, aber es wird nichts im MB-Bereich sein. Auch wenn es in Bits ist, glaube ich nicht, dass doppelte Werte in einer Anwendung ratsam sind. – Vamsi

+0

Nichts wird dupliziert, solange du die Variable als Methodenargument übergibst oder Aufgaben wie UCSProject proj = originalProjVar; – jgauffin

+0

vergib mir meine Ignoranz , aber nicht die Referenztypen erfordern einen Haltewert (wie ein Zeiger oder etwas), um auf sie zu verweisen. Ich meine, wenn wir einen Referenztyp als Argument übergeben, muss er zumindest die Referenz senden, die ein Duplikat ist – Vamsi

1

Wenn Sie keine der Strings oder Variablen zu modifizieren, dann müssen Sie nicht sperren .

Ich würde auch darüber nachdenken, dies zu einer statischen Klasse machen, wenn die Daten über die gesamte Anwendung geteilt werden - dann müssen Sie keine Instanz übergeben.

Wenn Sie die Daten ändern oder aktualisieren müssen - verwenden Sie Lock.

0

Sie können auch [ThreadStatic] verwenden. Der Wert der Variablen wird für jeden Thread eindeutig sein. Siehe MSDN für die Verwendung.