Ich habe eine Klasse, sagen wir "MyComputation", die eine Menge Berechnungen in einem langen Konstruktor ausführt. Es dauert in der Regel etwa 20 ms, wenn es ausgeführt wird (ohne Festplatten-E / A oder Netzwerkoperationen). 100 oder so Instanzen dieser Klasse werden von einer übergeordneten Klasse erstellt, sagen Sie „ComputeParent“, die sie in einem Threadpool als Arbeitselemente Warteschlangen:
%Vor%"myComputationCall" sieht so aus:
%Vor%done_event ist ein statisches ManualResetEvent:
%Vor%Ich führe ComputeParent etwa 500 Mal für verschiedene Eingabeparameter aus. Also habe ich viele verschachtelte Klassen. Das Problem besteht darin, dass die für die Ausführung von ComputeParent benötigte Zeit allmählich zunimmt. Es wird eine gewisse Variation zwischen dem, wie lange es dauert, jeden einzelnen ComputeParent laufen, aber die Zeit nimmt ganz stetig (geometrisch, jede nachfolgende Iteration länger dauern, durch eine längere Menge).
Der Speicherverbrauch des Programms nimmt im Laufe der Zeit nicht merklich zu, obwohl es ziemlich hoch ist (~ 300MB). Es läuft auf einem Computer mit 8 logischen Kernen, und die Prozessor-Nutzung scheint sehr unbeständig zu sein. Ich bin nicht sicher, was sonst für das Problem relevant sein könnte.
Ich würde es vorziehen, nicht ComputeParent durch Batch-Dateien in sich zu tragen, wenn das Problem nicht auftritt, stammend, wenn dies geschehen ist.
Wenn die Anzahl der verfügbaren Threads in ThreadPool 0 wird und Sie weiterhin neue Arbeitselemente hinzufügen, warten neu hinzugefügte Arbeitselemente auf "Warten". Das bedeutet, dass Ihr ComputeParent auf seine Instanzen von "myComputationCall" wartet. Starten mehr und mehr ComputeParent wird dazu führen, dass die durchschnittliche Ausführungszeit von ihnen steigt.
Diese Frage wurde beantwortet. Danke an alle Poster.
Für andere mit einem ähnlichen Problem würde ich die Task Parallel Library vorschlagen, wie von Henk vorgeschlagen.
Tags und Links c# multithreading performance threadpool