Ich habe den maximalen Thread auf 10 gesetzt. Dann habe ich 22000 Task mit ThreadPool.QueueUserWorkItem hinzugefügt. Es ist sehr wahrscheinlich, dass nach dem Ausführen des Programms nicht alle 22000-Tasks abgeschlossen wurden. Gibt es eine Beschränkung, wie viele Aufgaben für verfügbare Threads in die Warteschlange gestellt werden können?
Die Warteschlange hat keine praktische Grenze, aber der Pool selbst wird nicht mehr als 64 Wait-Handles überschreiten, dh die Gesamtzahl der aktiven Threads.
Wenn Sie warten müssen, bis alle Aufgaben verarbeitet sind, müssen Sie das selbst erledigen. Die ThreadPool-Threads sind Hintergrundthreads und halten die Anwendung nicht am Leben.
Dies ist eine relativ saubere Art, mit dieser Art von Situation umzugehen:
%Vor%Davon abgesehen ist es normalerweise besser, Ihre Arbeitselemente zusammenzufassen, wenn Sie Tausende davon haben, und sie nicht als separate Arbeitselemente für den Threadpool zu behandeln. Dies ist ein Teil der Verwaltung der Liste der Elemente und da Sie 22000 nicht gleichzeitig verarbeiten können, gruppieren Sie diese besser in Blöcke. Mit einzelnen Arbeitselementen wird jeder Prozess 50 oder so wahrscheinlich Ihren Gesamtdurchsatz ziemlich viel helfen ...
Dies ist eine implementationsabhängige Frage und die Implementierung dieser Funktion hat sich im Laufe der Zeit etwas geändert. Aber in .Net 4.0 sind Sie im Wesentlichen durch die Menge an Speicher im System begrenzt, da die Aufgaben in einer Speicherwarteschlange gespeichert sind. Sie können dies sehen, indem Sie durch die Implementierung in Reflektor graben.
Aus der Dokumentation von ThreadPool :
Hinweis: Die Threads im verwalteten Thread-Pool sind Hintergrundthreads. Das heißt, ihre IsBackground-Eigenschaften sind wahr. Das bedeutet, dass ein ThreadPool-Thread eine Anwendung nicht mehr ausführt, nachdem alle Vordergrund-Threads beendet wurden.
Ist es möglich, dass Sie beenden, bevor alle Aufgaben bearbeitet wurden?
Tags und Links .net c# multithreading threadpool