"Es gab nicht genügend freie threads im ThreadPool, um den Vorgang abzuschließen."
Bekam ich folgende Fehlermeldung beim Download mit mehreren threads:
Gab es nicht genügend freie threads im ThreadPool, um die komplette
Betrieb.
Sollte ich versuchen, ändern Sie die Standardeinstellungen für den threadpool in .net, und wie kann ich es tun?
- können Sie zeigen einige code? Höchstwahrscheinlich die Lösung ist nicht zum ändern der Größe des thread-pool - dein problem ist woanders
- Der Standardwert hängt von der Fx-version ist aber bereits sehr hoch.
- wie kann ich replizieren der Ausnahme, die Sie sehen? Tipp: sscce
- danke Euch allen, ich werde meine code und halten Sie Ihre Punkte in mind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern der Größe der
ThreadPool
ist sicherlich eine schlechte Idee (nicht zuletzt: jeder thread wird nehmen Sie ein weiteres Stück der Stapelspeicher); Sie sollten sich stattdessen auf Ihre thread-Verwendung - sind Sie sättigen den pool? Vielleicht finden TPL undTask[<T>]
einen besseren Weg zu behandeln einige async-code, oder in den Fällen, in Dingen wie IO - dieBegin*
/End*
asynchronen Operationen, die eher als ein sync-Vorgang auf einemThreadPool
thread.Könnten Sie auch überprüfen, dass alle Ihre asynchrone Operationen sind bestehende sauber; sind Sie vielleicht Stillstand (deadlock vielleicht) und nicht aussteigen?
Schließlich: die
ThreadPool
ist in Erster Linie gedacht, für kurze Operationen (wobei die spin-up-Kosten einesThread
am stärksten bemerkbar macht); die lang andauernde Vorgänge können besser auf dediziertenThread
sWebRequest
Klasse zu starten werfen Ausnahme im normal-Szenario.Obwohl dies nicht die Frage beantworten, direkt, es kann jemand helfen um dieses problem zu vermeiden. Sie können die unten zu sehen, wie viele threads zur Verfügung stehen, und stellen Sie sicher, dass Sie nicht überschreiten.
Dieser wird Ihnen die max-Gewinde lieferbar.
Für eine Beschreibung der verschiedenen Arten von threads, haben Sie einen Blick auf diese Erklärung:
Einfache Beschreibung des Arbeiter-und I/O-threads .NET
Ich bin mir nicht sicher, ob dies die beste Idee, in Ihrer situation, aber wenn Sie sich entscheiden, Sie wirklich brauchen, um erweitern die thread-pool dies ist eine Möglichkeit, es zu tun.
Können Sie emulieren, das Programm
AspNetServer
:Sehen, dass diese Methode
System.Net.NclUtilities.IsThreadPoolLow
:Und diese
System.Net.ComNetOS
.ctor()
: