Heim >Backend-Entwicklung >C++ >Warum erfordern Foreach-Schleifen und -Verschlüsse eine besondere Behandlung in Multithread-C#-Code?
Foreach-Schleifen und -Abschlüsse in Multithread-C# verstehen
Multithreading in C# kann bei der Verwendung von foreach
Schleifen und Abschlüssen zu Komplexitäten führen. Das Problem entsteht, wenn ein Abschluss innerhalb einer foreach
-Schleife auf die Iterationsvariable der Schleife verweist.
Betrachten Sie dieses Beispiel:
<code class="language-csharp">var threads = new List<Thread>(); foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }</code>
Hier erfasst der Abschluss jedes Threads einen Verweis auf die einzelne f
-Variable. Während die Schleife fortschreitet, ändert sich der Wert von f
, was zu unvorhersehbaren Ergebnissen führt – Threads können mit unerwarteten Foo
-Objekten arbeiten.
Gewährleistung der Thread-Sicherheit
Um dies zu vermeiden, erstellen Sie in jeder Iteration eine neue lokale Variable:
<code class="language-csharp">var threads = new List<Thread>(); foreach (Foo f in ListOfFoo) { Foo f2 = f; // Create a copy for each thread Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }</code>
Jetzt hat jeder Thread seine eigene unabhängige Referenz (f2
), wodurch sichergestellt wird, dass DoSomething()
auf der richtigen Foo
Instanz aufgerufen wird.
C# 5 und darüber hinaus
Das Verhalten hat sich in C# 5 und höher leicht geändert. Der Compiler behandelt die Variable foreach
effektiv als innerhalb des Schleifenbereichs deklariert, auch wenn sie außerhalb erscheint. Daher sind beide oben genannten Codeausschnitte in C# 5 und nachfolgenden Versionen threadsicher. Das explizite Kopieren bleibt jedoch aus Gründen der Klarheit und Abwärtskompatibilität eine gute Praxis.
Das obige ist der detaillierte Inhalt vonWarum erfordern Foreach-Schleifen und -Verschlüsse eine besondere Behandlung in Multithread-C#-Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!