2010-06-14 21 views
5

Ich habe eine Designfrage. Ich möchte Feedback geben, um zu erfahren, ob ein ThreadPool für das Clientprogramm geeignet ist, das ich gerade schreibe.Threadpool Design Frage

Ich habe einen Client, der als ein Dienst ausgeführt wird, der Datenbankdatensätze verarbeitet. Jeder dieser Datensätze enthält Verbindungsinformationen zu externen FTP-Sites [im Grunde ist es eine Warteschlange von Dateien zu übertragen]. Viele von ihnen sind auf dem gleichen Host, nur verschiedene Dateien verschieben. Daher gruppiere ich sie nach Host. Ich möchte in der Lage sein, einen neuen Thread pro Host zu erstellen. Es ist mir wirklich egal, wann die Übertragungen zu Ende sind, sie müssen nur die gesamte Arbeit erledigen (oder versuchen), die sie zugewiesen haben, und beenden sie dann, wenn sie fertig sind, und bereinigen alle Ressourcen, die sie in diesem Prozess verwendet haben.

Ich erwarte nicht mehr als 10-25 Verbindungen hergestellt werden. Sobald die Übertragungswarteschlange leer ist, wartet das Programm einfach, bis wieder Datensätze in der Warteschlange sind.

Ist der ThreadPool ein guter Kandidat dafür oder sollte ich einen anderen Ansatz verwenden?

Bearbeiten: In den meisten Fällen ist dies die einzige wichtige benutzerdefinierte Anwendung, die auf dem Server ausgeführt wird.

Antwort

2

Von dem, was Sie beschrieben haben, klingt es wie der Threadpool würde eine gute Passform sein. Probleme

:

  1. Ein Threadpool-Thread wird nicht halten Sie Ihren Prozess am Leben beim Herunterfahren. Stellen Sie sicher, dass dies das gewünschte Verhalten ist.

  2. Bei älterem Lesen kann das Binden des Threadpools mit lang laufenden Aufgaben, wenn die App auf inkompetente Verbindungen (wie eine Webanwendung) wartet, möglicherweise schlecht sein. Es klingt jedoch so, als hätten Sie einen dedizierten Windows-Dienst, daher glaube ich nicht, dass dies ein Problem ist.

  3. Nur weil Sie 10 Jobs im Thread-Pool werfen, bedeutet das nicht, dass es sofort 10 Threads versenden wird - Sie delegieren die Entscheidung, wie viele Threads für .net und die o/s verwendet werden sollen .

+0

+1 Stimmen Sie mit all Ihren Überlegungen überein, Threadpool ist eine großartige Ergänzung. – Walter

5

Nein, der Thread-Pool nicht angemessen. Der Thread-Pool ist wirklich für "kurze Aufgaben, die eine Hintergrundverarbeitung erfordern" konzipiert, da das Framework von der Verfügbarkeit von Threadpool-Threads abhängt und lange laufende Prozesse den Threadpool erschöpfen können.

FTP-Übertragungen benötigen eine relativ lange Zeit (selbst mit einer angemessenen Zeitüberschreitung), so dass sie nicht wirklich gut passen. Sie können in der Lage sein, mit dem Thread-Pool zu bekommen, aber Sie können auch feststellen, dass Sie in unerklärliche Fehler laufen, wenn Sie es verwenden. Es hängt davon ab, wie sehr Ihre Anwendung vom Threadpool abhängige Framework-Funktionen verwendet (asynchrone Delegaten usw.).

Das MSDN-Thema „The Managed Thread Pool“ bietet gute Richtlinien für wenn nicht Thread-Pool-Threads zu verwenden:

Es gibt verschiedene Szenarien, in denen es angebracht ist, zu Ihren eigenen Threads zu erstellen und zu verwalten, anstatt Gewinde der Verwendung Pool-Threads:

  • Sie benötigen einen Vordergrund-Thread.
  • Sie benötigen einen Thread mit einer bestimmten Priorität.
  • Sie haben Aufgaben, die dazu führen, dass der Thread für längere Zeit blockiert. Der Thread-Pool hat eine maximale Anzahl von Threads, so dass eine große Anzahl von blockierten Thread-Pool-Threads verhindern kann, dass Tasks gestartet werden.
  • Sie müssen Threads in eine single-threaded Wohnung platzieren. Alle ThreadPool-Threads sind in der Multithread-Wohnung.
  • Sie müssen eine stabile Identität mit dem Thread verbunden haben, oder widmen Sie einen Thread zu einer Aufgabe.
+0

Danke für Ihre Eingabe. Schlägst du vor, nur Threads zu erstellen und sie selbst zu verwalten? –

+0

In der Tat, die Erstellung der Threads und ihre Verwaltung selbst ist der Weg, auf lange Sicht zu gehen. Die Kosten für das Hochfahren von Threads sind im Vergleich zur FTP-Übertragungszeit unbedeutend, was einen der Hauptvorteile des Thread-Poolings darstellt (der andere ist die vereinfachte Schnittstelle "QueueUserWorkItem"). –

1

Ein Threadpool wäre schön, wie es Ihnen auf die Einrichtung von Jobs der Warteschlange auf Threads konzentrieren können, statt sich Gedanken über die Initialisierung und einzelne Fäden aufzuräumen.

Aber wie soll das funktionieren? Werden Sie mehrere Jobs in den Pool für einen Host einreihen oder haben Sie einen Thread für jeden Host, der Jobs aus seiner eigenen Warteschlange liest?

+0

Es gibt eine einzige Datenbanktabelle für die Warteschlange und eine Spalte nach Computername. Der Client-Dienst fragt nach seinem eigenen Computernamen ab. Dann wird aus dieser Teilmenge von Datensätzen (sagen wir, 100 Datensätze zurückgegeben), es wird nach Host gruppiert (sagen wir, dass es 4 eindeutige Hosts aus der Sammlung von 100 Datensätzen zurückgegeben hat). Also würde ich gerne 4 Threads im Pool für jeden dieser Hosts gestartet haben. –