foreach
Variablen und Multithread-Abschlüsse in C#: Sind sie sicher?
Wenn Sie foreach
verwenden, um eine Sammlung in C# zu durchlaufen, ist es wichtig, den Umfang und das Verhalten von Iterationsvariablen zu verstehen, insbesondere in einer Umgebung mit mehreren Threads.
Der folgende Codeausschnitt untersucht, ob es sicher ist, foreach
-Variablen direkt als Abschlussargumente im Multithreading zu verwenden, und ob für jede Iteration eine lokale Kopie erstellt werden muss.
Versionen vor C# 5
In Versionen vor C# 5 wurden foreach
Variablen außerhalb der Schleife deklariert. Dies bedeutet, dass eine einzelne Variableninstanz von allen Iterationen gemeinsam genutzt wird.
Bedenken Sie den ersten Codeausschnitt:
foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }
In diesem Beispiel wird die Variable f
von allen Threads gemeinsam genutzt, die während der Schleifeniteration erstellt wurden. Dies kann zu unvorhersehbaren Ergebnissen führen, da mehrere Threads möglicherweise Methoden auf verschiedenen Instanzen von Foo
oder mehrmals Methoden auf derselben Instanz aufrufen.
Um solche Probleme zu vermeiden, wird empfohlen, in jeder Iteration eine lokale Kopie der Variable f
zu erstellen, wie im zweiten Codeausschnitt gezeigt:
foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }
C# 5 und höher
C# 5 führt wesentliche Änderungen ein. In C# 5 und höher werden foreach
-Variablen innerhalb eines Schleifenbereichs definiert. Das bedeutet, dass jede Iteration eine eigene Instanz der Variablen hat.
Somit werden die beiden Codeschnipsel gleichwertig und sicher. Jeder Thread verfügt nun über eine eigene f
-Instanz innerhalb seines Abschlussbereichs, wodurch das Risiko von Verwirrung oder Inkonsistenz beseitigt wird.
Das obige ist der detaillierte Inhalt vonIst die direkte Verwendung der Variable „foreach' in C#-Multithread-Abschlüssen sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!