Grundlegendes zu Thread-Pools in C #

Ein Thread ist die kleinste Ausführungseinheit innerhalb eines Prozesses. Ein Thread-Pool besteht aus einer Anzahl von Threads, genauer gesagt einer Sammlung von Threads, und kann verwendet werden, um mehrere Aktivitäten im Hintergrund auszuführen.

Warum sollte ich Thread-Pools verwenden?

Threads sind teuer, da sie viele Ressourcen in Ihrem System für die Initialisierung, das Wechseln von Kontexten und die Freigabe der von ihnen belegten Ressourcen verbrauchen. Wenn ein Thread eine E / A-Operation ausführt (Dateiverwaltung, Datenbankoperation oder Zugriff auf die Netzwerkressourcen usw.), wird der Thread normalerweise vom Betriebssystem blockiert, bis die E / A-Operation abgeschlossen ist. Der Thread nimmt seinen CPU-Betrieb wieder auf, nachdem der E / A-Betrieb abgeschlossen ist.

Ein Thread-Pool ist eine gute Wahl, wenn Sie die Anzahl der Threads begrenzen möchten, die zu einem bestimmten Zeitpunkt ausgeführt werden, und den Aufwand für das Erstellen und Zerstören von Threads in Ihrer Anwendung vermeiden möchten. Dies ist auch eine gute Wahl, wenn Sie viele Aufgaben in Ihrer Anwendung haben, die entweder parallel oder gleichzeitig ausgeführt werden müssen, und Sie möchten die Reaktionsfähigkeit der Anwendung verbessern, indem Sie die Kontextwechsel vermeiden. Um einen Thread-Pool zu erstellen, können Sie die System.Threading.ThreadPool-Klasse nutzen.

Das folgende Codefragment zeigt, wie Sie die Mindestanzahl von Threads im Thread-Pool festlegen können.

ThreadPool.SetMinThreads (50, 50);

Beachten Sie jedoch, dass der Thread-Pool-Thread möglicherweise lange blockiert ist, wenn eine Aufgabe mit langer Laufzeit ausgeführt wird. Erschwerend kommt hinzu, dass eingehende Anforderungen, die von den Threads aus dem Thread-Pool abhängen, möglicherweise angehalten oder sogar abgelehnt werden, da der Thread-Pool möglicherweise keine verfügbaren Threads zur Verarbeitung einer eingehenden Anforderung enthält. Ein Thread-Pool ist auch keine gute Wahl, wenn Sie Threads haben, deren Prioritäten sich unterscheiden, oder wenn Sie einen Thread möglicherweise vorzeitig abbrechen müssen. Ein vorzeitiges Beenden eines Threads bedeutet, dass der Thread vor Ablauf seiner Bearbeitungszeit gewaltsam gestoppt wurde.

Wie funktioniert ein Thread-Pool?

Wenn Sie mit Thread-Pools arbeiten, erstellen Sie normalerweise eine Sammlung von Threads und speichern sie in einem Thread-Pool, bevor Sie die Threads in Ihrer Anwendung verwenden. Wenn Sie einen Thread benötigen, würden Sie diese Threads wiederverwenden, anstatt jedes Mal neue Threads zu erstellen, wenn die Anwendung einen Thread verwenden muss.

Daher würde die Anwendung eine Anforderung an den Thread-Pool senden, um einen Thread daraus abzurufen, Aktivitäten mithilfe des Threads auszuführen und den Thread anschließend wieder in den Thread-Pool zurückzugeben. Thread-Pools sind in Situationen hilfreich, in denen Sie mehr Aufgaben ausführen müssen, als Sie in Ihrer Anwendung erstellen können (die maximale Anzahl von Threads, die Sie pro Prozess erstellen können, ist begrenzt).

Wie kann ich einen Thread-Pool optimieren?

Wenn ein Prozess gestartet wird, wird ihm von der CLR ein Pool von Threads zugewiesen. Beachten Sie, dass Sie die Größe des Thread-Pools bei Bedarf konfigurieren können. Die Laufzeit verwaltet den Thread-Pool intelligent. Wenn der Thread-Pool gestartet wird, befindet sich nur ein Thread im Thread-Pool. Von da an erstellt der Thread-Pool-Manager (eine Komponente, die für die Verwaltung des Thread-Pools verantwortlich ist) mehr Threads und speichert sie im Thread-Pool, wenn die Belastung der Anwendung zunimmt. Das bedeutet, dass die Anwendung immer mehr Aufgaben gleichzeitig ausführen muss.

Die Anzahl der Threads, die zu einem bestimmten Zeitpunkt im Thread-Pool verfügbar sein können, wird durch die maximal zulässige Grenze der Threads im Thread-Pool bestimmt. Mit anderen Worten, die Anzahl der verfügbaren Threads im Thread-Pool variiert von Zeit zu Zeit, abhängig vom Verbrauch der Threads durch die Anwendung. Sobald das maximale Limit (maximale Anzahl von Threads im Thread-Pool) erreicht ist, erstellt die Anwendung viel seltener neue Threads.

Sie können die zulässige Obergrenze für Threads im Thread-Pool bei Bedarf jederzeit selbst festlegen. Dazu sollten Sie die Eigenschaft ThreadPool.SetMaxThreads nutzen. Verwenden Sie die ThreadPool.SetMinThreads-Eigenschaft, um die Untergrenze der Threads im Thread-Pool festzulegen. Die Standarduntergrenze für die Anzahl der Threads im Thread-Pool ist ein Thread pro Prozessor.