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.
Hier ist eine Idee, die das Erstellen einer Erweiterungsmethode für TaskFactory
beinhaltet.
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.
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()
...
Tags und Links .net multithreading task-parallel-library concurrency parallel-processing