Heim > Backend-Entwicklung > C++ > Ist die direkte Verwendung der Variable „foreach' in C#-Multithread-Abschlüssen sicher?

Ist die direkte Verwendung der Variable „foreach' in C#-Multithread-Abschlüssen sicher?

Barbara Streisand
Freigeben: 2025-01-22 06:56:12
Original
736 Leute haben es durchsucht

Is Using the `foreach` Variable Directly in C# Multi-threaded Closures Safe?

foreachVariablen 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();
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

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