Ich versuche eine WebApi-Methode zu erstellen, die eine Reihe von Schleifenberechnungen ausführt, deren weitere Optimierung schwierig ist.
%Vor%Wenn dieser Code ausgeführt wird und der Server-Task-Manager betrachtet wird, scheint es, dass er nur einen einzelnen Prozessorkern auslastet, während die anderen Kerne unberührt bleiben.
Nach dem, was ich gelesen habe, beschränkt asp.net eine einzelne Anfrage auf einen Prozessorkern. Da es sich um einen Intranetserver mit sehr geringen Gesamtanforderungen handelt, geht es mir nicht um die Verwaltung der Serverressourcen.
Gibt es eine Möglichkeit, dieses Verhalten zu überschreiben oder zu umgehen, damit meine Schleife schneller ausgeführt wird?
ASP.Net kann die Anzahl der Threads, die auch für TPL verwendet werden, auf sehr saubere Weise begrenzen. Einfach durch Erstellen eines TaskSchedulers, der auf einen Thread beschränkt ist und die ASP.Net-Anfrage auf einem gegebenen TaskScheduler startet. Ich wette, sie hätten einen Pool dieser limitierten TaskScheuler, es würde Sinn machen ...
Was passiert dann in der Task, die die ASP.Net-Anfrage verarbeitet, wenn Sie TPL oder PLINQ aufrufen?
Das Planen von Tasks mit Aufrufen von Task.Start oder noch besser und vom TPL-Team ist die bevorzugte Methode Task.Factory.StartNew.
ABER, ABER: Diese Aufgaben werden auf TaskScheduler.Current geplant, und das ist unser begrenzter TaskScheduler, auf dem wir bereits laufen! So werden alle geplanten Aufgaben auf dem begrenzten TaskScheduler ausgeführt, egal wie viele Kerne Ihr Computer hat.
Auf der anderen Seite scheint es, dass async / await-Operationen neue Tasks.Run () verwenden, die in .Net 4.5+ eingeführt wurden, und es wurde vorgeschlagen, Tasks auf TashScheduler.Default zu planen, was ist der ThreadPool selbst, also keine Beschränkung, außer der Anzahl der Kerne. Ich habe keinen Beweis, obwohl andere als diese führen: In Bezug auf die Verwendung von Task.Start (), Task.Run () und Task.Factory.StartNew () TPL
Leider hat AsParallel () keine Überladung mit TaskScheduler.
Also wäre die Lösung:
ACHTUNG: Bitte beachten Sie, dass das Planen von schweren Sachen auf ThreadPool in ASP.Net zu einer abnehmenden Performance bei der Verarbeitung von ASP.Net-Anfragen führen kann ...