Frage

Meine Frage ist vielleicht ein bisschen naiv klingen, aber ich bin ziemlich neu mit Multi-Threaded-Programmierung.

Ich schreibe eine Anwendung, die eingehende externe Daten verarbeitet. Für jeden Datensatz, der eine neue Aufgabe kommt auf folgende Weise erstellt:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

Die Elemente der Daten kommen sehr schnell (jede zweite, halbe Sekunde, etc ...), so viele Aufgaben erstellt werden. jede Aufgabe Handhabung nimmt um vielleicht eine Minute. Wenn es die Prüfung sah ich, dass die Anzahl der Threads die ganze Zeit zunimmt. Wie kann ich begrenzen die Anzahl der Aufgaben erstellt, so dass die Anzahl der tatsächlichen Arbeitsfäden stabil und effizient ist. Mein Computer ist nur Dual-Core.

Danke!

War es hilfreich?

Lösung

Eines Ihrer Probleme ist, dass die Standard-Scheduler Aufgaben sieht, dass für eine Minute letzte und die Annahme macht, dass sie auf einem anderen Aufgaben blockiert sind, die noch ausgeführt werden. Um zu versuchen und Entsperrung Dinge, die es Zeitplan mehr anstehenden Aufgaben, daher den Faden Wachstum. Es gibt ein paar Dinge, die Sie hier tun können:

  • Machen Sie Ihre Aufgaben kürzer (wahrscheinlich keine Option).

  • Schreiben Sie einen Scheduler, dass sich mit diesem Szenario und fügen Sie nicht mehr Threads.

  • Mit SetMaxThreads zu verhindern unbeschränktes Thread-Pool Wachstum.

Siehe Abschnitt Thema Injection hier:

http://msdn.microsoft.com/en-us/library/ ff963549.aspx

Andere Tipps

Sie sollten prüfen mit die Erzeuger / Verbraucher-Muster mit einem BlockingCollection<T> um eine ConcurrentQueue<T> , wo Sie die BoundedCapacity zu etwas, das macht die Eigenschaften Ihrer Arbeitsbelastung gegeben Sinn. Sie können Ihre BoundedCapacity konfigurierbar machen und dann zwicken, wie Sie durch einige Profilierungs Sitzungen führen Sie den Sweet Spot zu finden.

Es ist zwar richtig, dass die TPL Pflege nehmen die Aufgaben der Schlange stehen, die Sie erstellen, zu viele Aufgaben zu schaffen nicht ohne Strafen kommt. Auch, was ist der Punkt in mehr Arbeit produzieren, als Sie verbrauchen können? Sie wollen genug Arbeit produzieren, dass die Verbraucher werden nie gehungert werden, aber Sie wollen nicht zu weit vor dir selbst zu erhalten, weil das ist nur die Verschwendung von Ressourcen und möglicherweise genau diese Ressourcen aus Ihren Verbrauchern zu stehlen.

Sie können eine benutzerdefinierte TaskScheduler für die Parallel-Bibliothek Aufgabe erstellen und dann Zeitplan Aufgaben auf, dass durch eine Instanz davon an dem TaskFactory Konstruktor.

Hier ist ein Beispiel dafür, wie das zu tun: Taskplaner mit einem maximalen Grad der Parallelität .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top