2010-12-30 18 views
1

Ich habe ein sehr seltsames Problem mit meinem Code. Es wird vollständig die erste for-Schleife ausführen, dann die foreach, aber dann springt es zurück zum "ThreadStart IMAPDelegate" (Zeile 1 der for-Schleife) und stürzt dann wegen einer ArgumentOutOfRangeException ab. Kann jemand erklären, warum das Programm dies tut? Ich habe es Zeile für Zeile ausgepackt und es springt buchstäblich einfach wieder in die a-Zeile der for-Schleife. Wenn es die for-Schleife normalerweise wieder ausgeführt hätte, hätte es x wieder auf 0 gesetzt und es wäre nicht abgestürzt. Irgendwelche Vorschläge?Erstellen eines Array von Threads in C#

for (int x = 0; x < UserInfo.Count; x++) 
{ 
    ThreadStart IMAPDelegate = delegate{SendParams(UserInfo[x], IMAPServers[x]); }; 
    MyThreads.Add(new Thread(IMAPDelegate)); 
} 

foreach (Thread thread in MyThreads) 
{ 
    thread.Start(); 
} 

Antwort

5

Dies ist beabsichtigt, wenn Sie eine anonyme Methode wie diese verwenden. Sobald der Thread gestartet wird, führt er den Methodenaufruf SendParams() aus. Was dann bombardiert, weil die Variable "x" bereits über UserInfo.Count hinaus inkrementiert wurde. Fix:

for (int x = 0; x < UserInfo.Count; x++) 
{ 
    int user = x; 
    ThreadStart IMAPDelegate = delegate{SendParams(UserInfo[user], IMAPServers[user]); }; 
    MyThreads.Add(new Thread(IMAPDelegate)); 
} 
+1

+1 Sonst bekannt als "Closing über den Loop-Variable": (http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the- loop-variable-admined-behbreal.aspx –

+0

Wenn UserInfo und MyTheads beide mehr als ein Element haben, gibt es den Fehler Count = Funktionsauswertung deaktiviert, da eine vorherige Funktionsauswertung abgelaufen ist. Sie müssen die Ausführung fortsetzen, um sie wieder aktivieren zu können –

+0

Das ist kein Fehler, nur der Debugger beschwert sich, dass er zeitweise seine Murmeln verloren hat.Das passiert. Es gibt einen Hotfix für Debugger-Probleme mit Threads, wenn Sie VS2008 verwenden. Oder drücken Sie F5. http://support.microsoft.com/ kb/957912 –