Prozesswarteschlange mit Multithreading oder Tasks

8

Ich habe eine Telefonie-Nachrichtenanwendung, in der es viele viele zu verarbeitende Nachrichten gibt. Da Telefonanschlüsse begrenzt sind, wird die Nachricht zuerst zuerst verarbeitet. Jede Nachricht hat ein Flag 'Bestätigung', das anzeigt, was gerade verarbeitet wird. Es wurde natürlich als falsch initialisiert.

Ich möchte alle Nachrichten in eine Warteschlange stellen und sie dann mit mehreren Threads oder Aufgaben verarbeiten.

%Vor%

Jetzt ist meine Frage, wie man das Element aus der Warteschlange mit Multithreading herausnimmt. Für jedes Element aus der Warteschlange möchte ich ein Skript ausführen.

%Vor%

Was ich dachte war zu sehen, ob

  

if (MessageWorkItem.Count & gt; = 1)   Dann etwas tun, aber ich brauche Code Hilfe.

    
Servy 27.03.2014, 13:09
quelle

2 Antworten

13

Wenn Sie .Net 4.5 verwenden können, sollten Sie sich Dataflow von der Task Parallel Library anschauen (TPL) .

Diese Seite führt zu vielen beispielhaften exemplarischen Vorgehensweisen wie How to : Implementieren Sie ein Producer-Consumer-Datenflussmuster und Exemplarische Vorgehensweise: Verwenden Datenfluss in einer Windows Forms-Anwendung .

Sehen Sie sich diese Dokumentation an, um zu sehen, ob sie Ihnen helfen könnte. Es ist ziemlich viel zu übernehmen, aber ich denke, es wäre wahrscheinlich die beste Vorgehensweise.

Alternativ könnten Sie auch nach einem BlockingCollection zusammen mit der GetConsumingEnumerable() -Methode für den Zugriff auf Elemente in der Warteschlange.

Sie teilen die Arbeit in Objekte auf, die Sie irgendwie verarbeiten möchten, und verwenden eine BlockingCollection, um die Warteschlange zu verwalten.

Ein Beispielcode, der ints anstelle von Objekten als Arbeitselemente verwendet, wird Ihnen dabei helfen, dies zu demonstrieren:

Wenn ein Worker-Thread mit seinem aktuellen Element fertig ist, wird ein neues Element aus der Arbeitswarteschlange entfernt, dieses Element verarbeitet und dann zur Ausgabewarteschlange hinzugefügt.

Ein separater Consumer-Thread entfernt fertiggestellte Elemente aus der Ausgabewarteschlange und macht etwas mit ihnen.

Am Ende müssen wir warten, bis alle Worker fertig sind (Task.WaitAll (workers)), bevor wir die Ausgabewarteschlange als abgeschlossen markieren können (outputQueue.CompleteAdding ()).

%Vor%     
Matthew Watson 27.03.2014, 13:57
quelle
2

Parallel.ForEach von TPL . Es ist parallel für jeden.

Beispiel (geändertes MessageWorkItem in generische Warteschlange):

%Vor%     
eXit 27.03.2014 13:17
quelle