Nur n Elemente gleichzeitig mit Task Parallel Library verarbeiten

8

Dies geschieht alles in einem Windows-Dienst.

Ich habe ein Queue<T> (eigentlich ein ConcurrentQueue<T> ), das Elemente enthält, die auf die Verarbeitung warten. Aber ich möchte nicht immer nur einen nach dem anderen verarbeiten, ich möchte n Elemente gleichzeitig verarbeiten, wobei n eine konfigurierbare Ganzzahl ist.

Wie gehe ich dazu über die Task Parallel Library?

Ich weiß, dass TPL Sammlungen im Auftrag des Entwicklers für die gleichzeitige Verarbeitung partitioniert, aber ich bin mir nicht sicher, ob das die Funktion ist, nach der ich suche. Ich bin neu in Multithreading und TPL.

    
Ronnie Overby 04.08.2011, 18:47
quelle

3 Antworten

4

Hier ist eine Idee, die das Erstellen einer Erweiterungsmethode für TaskFactory beinhaltet.

%Vor%

Dann würde Ihr Anrufcode wie folgt aussehen.

%Vor%

Hier ist eine andere Idee mit Parallel.ForEach . Das Problem bei diesem Ansatz besteht darin, dass Ihre Parallelitätsgrade nicht unbedingt berücksichtigt werden müssen. Sie geben nur die maximal erlaubte Menge und nicht die absolute Menge an.

%Vor%     
Brian Gideon 04.08.2011 19:12
quelle
4

Verwenden Sie BlockingCollection<T> anstelle von ConcurrentQueue<T> , dann können Sie beliebig viele Consumer-Threads starten und Take method von BlockingCollection verwenden. Wenn die Sammlung leer ist, blockiert die Take -Methode automatisch den Thread des Aufrufers, der darauf wartet, dass Elemente hinzugefügt werden, da andernfalls die Threads alle Warteschlangenelemente parallel verarbeiten. Da Ihre Frage jedoch die Verwendung von TPL erwähnt, stellt sich heraus, dass Parallel.ForEach einige Probleme bei der Verwendung von BlockingCollection check diese Post für weitere Details. Sie müssen also die Erstellung Ihrer Consumer-Threads selbst verwalten. new Thread(/*consumer method*/) oder new Task() ...

    
Jalal Said 04.08.2011 18:51
quelle
1

Ich würde auch empfehlen, ein BlockingCollection zu verwenden, anstatt direkt ein ConcurrentQueue zu verwenden.

Hier ist ein Beispiel:

%Vor%

Beachten Sie, dass maxConcurrent im Konstruktor definiert, wie viele Anfragen gleichzeitig verarbeitet werden.

    
Cocowalla 16.08.2012 18:53
quelle