Wann sollte eine Aufgabe als "langfristig" eingestuft werden?

Bei der Arbeit mit Aufgaben scheint die Faustregel zu lauten, dass der Thread-Pool - normalerweise von z. @ aufrufTask.Run(), oderParallel.Invoke() - sollte für @ verwendet werdrelativ kurz Operationen. Wenn Sie mit langen Betriebszeiten arbeiten, sollten Sie das @ -Zeichen verwendeTaskCreationOptions.LongRunning flag, um - soweit ich das verstehe - zu vermeiden, dass die Thread-Pool-Warteschlange verstopft wird, d. h. um die Arbeit auf einen neu erstellten Thread zu übertragen.

Aber was genau ist einlong running Betrieb?Wie lange ist in Bezug auf die Zeit lang? Gibt es neben der erwarteten Aufgabendauer noch andere Faktoren, die bei der Entscheidung, ob das @ verwendet werden soll, berücksichtigt werden müsseLongRunning, wie die erwartete CPU-Architektur (Häufigkeit, Anzahl der Kerne, ...) oder die Anzahl der Aufgaben, die aus Sicht des Programmierers gleichzeitig ausgeführt werden sollen?

Nehmen wir zum Beispiel an, ich habe 500 Aufgaben in einer speziellen Anwendung zu erledigen, die jeweils 10 bis 20 Sekunden dauern. Soll ich einfach alle 500 Tasks mit Task.Run starten (z. B. in einer Schleife) und sie dann alle abwarten, vielleicht alsLongRunning, während die Standardeinstellung für die maximale Anzahl von gleichzeitigen Zugriffen beibehalten wird? Andererseits, wenn ich @ setLongRunning Wäre dies in einem solchen Fall nicht der Fall, wenn 500 neue Threads erstellt würden und viel Overhead und eine höhere Speichernutzung (aufgrund der Zuweisung zusätzlicher Threads) im Vergleich zum Weglassen von @ verursacht würdeLongRunning? Dies setzt voraus, dass keine neuen Aufgaben zur Ausführung geplant werden, solange diese 500 erwartet werden.

Ich würde vermuten, dass die Entscheidung zu setzenLongRunning hängt von der Anzahl der Anforderungen ab, die in einem bestimmten Zeitintervall an den Thread-Pool gesendet wurden.LongRunning sollte nur für Tasks verwendet werden, von denen erwartet wird, dass sie wesentlich länger dauern als die meisten im Threadpool platzierten Tasks - per Definition höchstens ein kleiner Prozentsatz aller Tasks. Mit anderen Worten, dies scheint ein Problem bei der Optimierung der Warteschlangen- und Thread-Pool-Nutzung zu sein, das wahrscheinlich, wenn überhaupt, von Fall zu Fall durch Tests gelöst werden sollte. Hab ich recht

Antworten auf die Frage(8)

Ihre Antwort auf die Frage