Heim > Backend-Entwicklung > C++ > Warum erfordern Foreach-Schleifen und -Verschlüsse eine besondere Behandlung in Multithread-C#-Code?

Warum erfordern Foreach-Schleifen und -Verschlüsse eine besondere Behandlung in Multithread-C#-Code?

Patricia Arquette
Freigeben: 2025-01-22 07:17:13
Original
999 Leute haben es durchsucht

Why Do Foreach Loops and Closures Require Special Handling in Multithreaded 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage