Hier ist ein Konsolenprogramm, das 10 Threads im Batch starten, 5 Sekunden warten und im Batch anhalten soll.
%Vor%aber das Ergebnis ist nicht das, was ich erwartet habe, 10 Threads beginnen LANGSAM (ungefähr 1 Sekunde Intervall), sogar ein "Finish" kommt vor einem "Start" heraus.
Wenn Thread.Sleep auskommentieren, beginnen und enden alle Threads im Flash.
Beeinflusst Thread.Sleep
andere Threads? Gibt es überhaupt eine reine Leerlaufzeit?
/ ----------------------------- bearbeiten ---------------- -------------
Das gleiche Problem passiert auch in:
%Vor%---------------------- Bearbeiten ------------------------
endlich habe ich einen schönen Weg gefunden, thread.sleep
zu ersetzen %Vor%Dies ist beabsichtigt. Sie sehen, dass der Threadpool-Manager versucht, eine begrenzte Anzahl von Threads im Ausführungsstatus zu behalten. Wichtig, um sicherzustellen, dass Ihr Programm nicht mehr Threads ausführt, als Ihr Computer über CPU-Kerne verfügt. Das ist ineffizient, es wird weniger Arbeit geleistet, wenn Windows gezwungen wird, die Kerne zwischen aktiven Threads auszutauschen. Der Threadpool-Manager ist nicht intelligent genug, um zu wissen, dass der Thread inaktiv ist und keine Arbeit ausführt.
Auf einem Dual-Core-Computer werden die ersten zwei Threads sofort angezeigt. Dann dürfen weitere Threads nacheinander ausgeführt werden, wobei der Thread-Manager feststellt, dass die aktiven Threads keine Fortschritte machen und wahrscheinlich blockiert sind. Die Reihenfolge, in der Threads freigegeben werden und der Aufruf von Console.Write () ausgeführt wird, ist nicht deterministisch.
Das ist natürlich ein künstlicher Test, echte Threads schlafen nicht. Wenn Sie lange blockierende Threads haben und beispielsweise warten, bis eine E / A-Anforderung abgeschlossen ist, ist die Verwendung von Threadpool-Threads (Tasks) nicht die beste Lösung.
TaskCreationOptions.LongRunning
wird die ThreadPool-Beschränkung entfernen.
Ich kenne nicht den einfachen Weg, TaskCreationOptions.LongRunning
für Parallel.For
anzugeben.
Sie können jedoch denselben Effekt mit der Task-Klasse erzielen:
Ohne TaskCreationOptions.LongRunning
wird es genauso laufen wie Parallel.For
.
Ich habe den Code leicht aktualisiert, um die ThreadID beim Schreiben in die Konsole anzuzeigen:
%Vor%Meine Maschine ist ein Dual-Core, hier ist der Output, den ich bekomme. Dies sollte Ihnen ein Gefühl dafür geben, was passiert. Denken Sie daran, dass die Schleife nicht immer in der Reihenfolge läuft, d. H. 0 bis 9, parallel ist, greift sie einen Teil Ihres Arrays und führt jedes Element durch das Lambda.
Ausgabe:
%Vor%Tags und Links c# multithreading thread-sleep parallel-for