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% 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.
Tags und Links c# multithreading .net-3.5