Aufgaben gegen ThreadPool

8

Ich habe eine Anwendung in C # mit einer Liste von zu erledigenden Aufgaben. Ich möchte so viel wie möglich parallel arbeiten. Allerdings muss ich in der Lage sein, die maximale Anzahl paralleler Aufgaben zu steuern.

Soweit ich weiß, ist dies mit einem ThreadPool oder mit Tasks möglich. Gibt es einen Unterschied in dem, den ich benutze? Mein Hauptanliegen ist es, steuern zu können, wie viele Threads gleichzeitig aktiv sind.

    
prestomanifesto 09.11.2011, 21:10
quelle

5 Antworten

19

Sehen Sie sich ParallelOptions.MaxDegreeOfParallelism an Task s.

Ich würde Ihnen empfehlen, Tasks zu verwenden, da sie eine Abstraktion auf höherer Ebene als der ThreadPool bieten.

Eine sehr gute Lektüre zum Thema finden Sie hier . Wirklich, ein Muss-Buch und es ist kostenlos darüber hinaus:)

    
Vladislav Zorov 09.11.2011, 21:16
quelle
5

In TPL können Sie die WithDegreeOfParallelism auf einem ParallelEnumerable oder ParallelOptions.MaxDegreeOfParallism

Es gibt auch die CountdownEvent , die möglicherweise eine bessere Option ist wenn Sie nur benutzerdefinierte Threads oder Aufgaben verwenden.

In ThreadPool , wenn Sie SetMaxThreads es ist global für die AppDomain , so dass Sie unnötigen Code unnötig einschränken könnten.

  

Sie können die Anzahl der Worker-Threads oder die Anzahl der E / A-Vervollständigungs-Threads nicht auf eine kleinere Anzahl als die Anzahl der Prozessoren im Computer festlegen.

     

Wenn die Common Language Runtime beispielsweise von Internetinformationsdienste (IIS) oder SQL Server gehostet wird, kann der Host Änderungen an der Threadpoolgröße einschränken oder verhindern.

     

Seien Sie vorsichtig, wenn Sie die maximale Anzahl von Threads im Thread-Pool ändern. Während Ihr Code davon profitieren könnte, könnten sich die Änderungen nachteilig auf die von Ihnen verwendeten Code-Bibliotheken auswirken.

     

Wenn Sie die Größe des Threadpools zu groß festlegen, kann dies zu Leistungsproblemen führen. Wenn zu viele Threads zur gleichen Zeit ausgeführt werden, wird der Task-Switching-Overhead zu einem signifikanten Faktor.

Ich stimme der anderen Antwort zu, dass Sie TPL über die ThreadPool als eine bessere Abstraktion von Multi-Threading verwenden sollten, aber es ist möglich, das zu erreichen, was Sie in beiden wollen.

    
Paul Tyng 09.11.2011 21:25
quelle
3

In diesem Artikel auf msdn erklären sie, warum sie Tasks anstelle von ThreadPool für Parallelismus empfehlen .

    
PierrOz 09.11.2011 21:17
quelle
2

Sie können auch einen Semaphor erstellen, um zu steuern, wie viele Threads gleichzeitig ausgeführt werden können. Sie können einen neuen Semaphor erstellen und im Konstruktor angeben, wie viele gleichzeitige Threads diesen Semaphor gleichzeitig verwenden können. Da ich nicht weiß, wie Sie die Threads verwenden werden, wäre dies ein guter Ausgangspunkt.

MSDN-Artikel in der Semaphore-Klasse

-Wesley

    
Wesley 09.11.2011 21:15
quelle
2

Die Aufgabe hat eine sehr charmante Eigenschaft für mich, Sie können Ketten von Aufgaben erstellen. Welche auf bestimmten Ergebnissen der Aufgabe zuvor ausgeführt werden. Eine Funktion, die ich oft verwende, ist folgende: Aufgabe A läuft im Hintergrund, um einige lange Arbeit zu erledigen. Ich ketten Task B danach, nur ausgeführt, wenn Task A regelmäßig beendet ist, und ich konfiguriere es so, dass es im Vordergrund läuft, so dass ich meine Steuerelemente leicht mit dem Ergebnis der lang laufenden Task A aktualisieren kann.

    
Fischermaen 09.11.2011 21:18
quelle