Mit TPL-wie Erreiche ich einen max-threadpool-Größe
Ich bin mit dem TPL auf neue Aufgaben hinzufügen, um die system-thread-pool mit der Funktion Task.Factory.StartNew()
. Das problem ist nur, dass ich bin das hinzufügen einer Menge threads und ich denke, es ist das erstellen von zu vielen für meinen Prozessor zu behandeln. Gibt es eine Möglichkeit die maximale Anzahl der threads, die in diesem thread pool?
- Denken Sie nicht nur, herauszufinden, ob es tatsächlich wahr ist.
- Alle code-Beispiele?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Standard -
TaskScheduler
(erhalten ausTaskScheduler.Default
) ist vom Typ (interne Klasse)ThreadPoolTaskScheduler
. Diese Implementierung verwendet dieThreadPool
Klasse Warteschlange Aufgaben (wenn dieTask
ist nicht mit erstelltTaskCreationOptions.LongRunning
- in diesem Fall wird ein neuer thread erstellt wird, für jede Aufgabe).Also, wenn Sie wollen, beschränken Sie die Anzahl der threads zur Verfügung
Task
Objekte erstellt, die übernew Task(() => Console.WriteLine("In task"))
können Sie begrenzen die verfügbaren threads in der globalen threadpool wie diese:Den Aufruf
ThreadPool.GetMaxThreads()
getan wird, um zu vermeiden, schrumpft diecompletionPortThreads
.Beachten Sie, dass dies kann eine schlechte Idee - da alle Aufgaben ohne eine bestimmte scheduler, und eine beliebige Anzahl von anderen Klassen verwenden Sie die Standard-ThreadPool, die Größe zu niedrig Nebenwirkungen: Hunger, etc.
In der Regel TPL bestimmt eine gute "Standard" - threadpool-Größe. Wenn Sie wirklich brauchen, weniger threads, siehe Gewusst wie: Erstellen eines Task-Scheduler, der die Grenzen der Grad der Parallelität
Sollten Sie untersuchen Ihre performance-Probleme zuerst. Es gibt verschiedene Probleme, die möglicherweise im geringeren Auslastung:
In jedem Fall haben Sie die Skalierbarkeit Problem, das nicht angesprochen werden, einfach durch die Verringerung der Anzahl der gleichzeitigen Aufgaben. Ihr Programm ausführen kann, in einer zwei-,vier-oder acht-Kern-Maschine in der Zukunft. Die Begrenzung der Anzahl der geplanten Aufgaben wird einfach führen, um Verschwendung von CPU-Ressourcen.
In der Regel die TPL Planer sollten tun, einen guten job zu wählen, wie viele Aufgaben gleichzeitig ausgeführt werden, aber wenn Sie wirklich wollen, um Kontrolle über es Mein blog-post zeigt, wie dies mit den Aufgaben und mit Aktionen und enthält ein Beispiel-Projekt können Sie herunterladen und ausführen, um zu sehen, beide in Aktion.
Beispiel möchten Sie vielleicht, um explizit zu begrenzen, wie viele Aufgaben sind lief gleichzeitig ist, wenn Sie anrufen, Ihre eigenen Leistungen und wollen nicht zu überlasten den server.
Für das, was du beschreibst, klingt es, wie können Sie profitieren mehr von machen sicher, dass Sie mit async/await mit Ihren Aufgaben um zu verhindern, dass unnötige thread-Verbrauch. Dies wird davon abhängen, obwohl, wenn Sie tun, CPU-gebundene Arbeit, oder IO-bound Arbeit in Ihren Aufgaben. Wenn es IO-bound sind, dann können Sie großen nutzen aus der Verwendung von async/await.
Egal, Sie fragte, wie begrenzen Sie die Anzahl der tasks, die gleichzeitig ausgeführt werden können, also hier ist etwas code zu zeigen, wie es mit den beiden Aktionen und Aufgaben.
Mit Aktionen
Wenn über Aktionen, die Sie verwenden können, die built-in .Net Parallel.Invoke-Funktion. Hier beschränken wir es zu laufen bei den meisten 3 threads parallel.
Mit Aufgaben
Da man sich mit Aufgaben hier, aber, es gibt keine eingebaute Funktion. Allerdings können Sie die eine, die ich auf meinem blog.
Und dann erstellen Sie Ihre Liste von Aufgaben und die Funktion aufrufen, haben Sie ausgeführt, mit sagen wir maximal 3 gleichzeitige zu einer Zeit, Sie könnten dies tun: