Threads erhalten falsche Parameter

8

Ich muss eine Methode mit einem bestimmten Parameter in einem Thread ausführen. Ich habe bemerkt, dass wenn ich es laufen lasse, Der Parameter ist falsch. Für das gegebene Beispiel habe ich ein Array int[] output mit den Zahlen 1-7. Für jede Nummer erstelle ich einen Thread mit der Methode WriteInt(i) . Ich erwarte, dass die Ausgabe in jeder Reihenfolge 1-7 sein wird, aber ich sehe ständig, dass einige Zahlen fehlen und andere dupliziert werden. Was ist los und was wäre der richtige Weg, um diese Threads zu starten?

(Die Liste ist nur dazu da, um die Threads später zu verbinden)

%Vor%

Beispielausgabe:

%Vor%     
SaulBack 07.09.2012, 19:25
quelle

1 Antwort

14

Der Abschluss, der vom Lambda ( () => WriteInt(i) ) erstellt wird, schließt sich über die Variable i , nicht den Wert, der innerhalb jeder Iteration auf i gesetzt wurde. Während der Thread ausgeführt wird, wird der zu diesem Zeitpunkt in i festgelegte Wert verwendet, der wahrscheinlich bereits aufgrund der foreach Schleifenverarbeitung geändert wurde.

Sie brauchen eine temporäre:

%Vor%

Details zu den Geschehnissen finden Sie in Eric Lipperts Beitrag mit dem Titel Schließen der Schleife Variable als schädlich .

Auch dies ist in C # 5 (VS2012) kein Problem mehr für foreach loops. Es wird jedoch immer noch mit einer for-Schleife passieren.

    
Reed Copsey 07.09.2012, 19:26
quelle

Tags und Links