2016-12-10 3 views
0

Ich muss meine Variable "Zähler" für jeden Thread privat halten.C# Sperre macht meine Variable nicht privat

Ich habe versucht, zu verwenden:

arbeitet
object locker = new object(); 
private object locker = new object(); 
private static readonly object locker = new object(); 

Aber keiner von ihnen.

Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

Hier ist mein Code.

public partial class Form1 : Form 
{ 

    int counter = 0; 
    private static readonly object locker = new object(); 
    public Form1() 
    { 
     InitializeComponent(); 
     Task t1 = new Task(() => 
     { 
      func(); 
     }); 
     Task t2 = new Task(() => 
     { 
      func(); 
     }); 
     // two threads 
     t1.Start(); 
     t2.Start(); 
    } 

    void func() 
    { 
     lock (locker) 
     { 
      counter++; 
      Console.Write(counter + " "); // prints "1 2" 
              // it should print "1 1" 
     } 
    } 
} 
+0

Gibt es einen Grund, warum Sie 'counter' nicht einfach in' 'func'' verschieben können? – Abion47

+0

Die Thread-Verriegelungsvariable ist nicht das Problem. Dies ist genau das, was die erwartete Ausgabe ist - Sie haben nur die 'Counter'-Variable Thread-sicher gemacht. Es kann immer nur um einen Thread auf einmal erhöht werden, deshalb gibt es '1 2'. Wenn Sie Ihre Sicherheitsmaßnahmen entfernen (d. H. Das 'lock (..)'), wird die Ausgabe unvorhersehbar und gibt möglicherweise '1 1' aus, da jetzt zwei Threads gleichzeitig zur selben Variablen lesen und schreiben können. 'counter' ist eine ** globale ** Variable in Bezug auf die Klasse und keine Thread-lokale Variable. –

+0

@MaximilianGerhardt Ich denke, du meinst eine Variable auf Klassenebene. C# hat keine globalen Variablen. – Abion47

Antwort