2015-02-24 11 views

Antwort

23

Das ist eigentlich eine ziemlich interessante Frage und ein Szenario. Bis zu einem gewissen Grad ist async die neue Hitze (obwohl es wirklich nicht so neu ist). Entity Framework 6 schlug mit asynchronen Methoden und jeder ... single ... Stück ... von ... Dokumentation ... plötzlich mit async für alles. Ich denke, wir sehen hier ein bisschen das Gleiche. MVC 6 unterstützt Async für Dinge wie das Rendern von Teiltönen, also OMG wir haben alle nur haben async jetzt zu verwenden.

Async dient einem ganz bestimmten Zweck. Es ermöglicht, dass der aktive Thread in den Pool zurückgegeben wird, um andere Aufgaben zu verteilen, während sich die aktuelle Aufgabe in einem Wartezustand befindet. Der Schlüssel dazu ist "Wartezustand". Bestimmte Aufgaben sind einfach nicht kompatibel mit async. CPU-gebundene Aufgaben wie komplexe Finanzanalysen ermöglichen es dem Thread nie, in einen Wartezustand zu wechseln, sodass alles effektiv als Synchronisierung ausgeführt wird, selbst wenn Sie es als Async einrichten. Andererseits können Dinge, die die Netzwerklatenz betreffen (Anfordern einer Ressource von einer Web-API, Abfragen einer Datenbank usw.) oder die E/A-gebunden sind (Lesen/Schreiben von Dateien usw.), manchmal Perioden aufweisen, in denen der Thread ist warten darauf, dass ein anderer Prozess abgeschlossen wird, bevor die Verarbeitung fortgesetzt wird.

Betrachtet man speziell das Rendern eines Partials, ist das einzige Stück, das nicht vollständig CPU-gebunden ist, das Lesen der View-Datei selbst aus dem Dateisystem. Während das ist technisch genug, um es für async geeignet machen, wie lange dauert es wirklich zu lesen, was im Wesentlichen eine Textdatei ist, die wahrscheinlich weniger als 50 KB maximal ist. Zu dem Zeitpunkt, zu dem der Thread an den Pool zurückgegeben wird, ist es wahrscheinlich an der Zeit, ihn erneut anzufordern, sodass Sie Ressourcen zu diesem Zeitpunkt tatsächlich ineffizienter verwenden.

Lange und kurze, fallen Sie nicht in die Falle von "es kann async getan werden, also muss ich es async tun". Jede Verwendung sollte dahingehend bewertet werden, ob tatsächlich ein Wert darin enthalten ist. Async hat eine Menge Overhead und wenn Sie nur über ein paar Millisekunden Wartezeit sprechen, ist es wahrscheinlich nicht all den zusätzlichen Aufwand wert.

+2

Tatsächlich liefert 'await' den aktuellen Thread, bis die Aufgabe abgeschlossen ist. Das hat nichts mit Wartezeiten zu tun. –

+0

Erstens spreche ich nicht speziell über das async-Schlüsselwort, hier nur asynchron. Zweitens habe ich keine Ahnung, was deine letzte Aussage bedeutet. Es hat alles damit zu tun, in einem Wartezustand zu sein. Der Thread wird nicht einfach automatisch zurückgegeben. Es muss funktionieren, bis es auf etwas wartet, das sich seiner Kontrolle entzieht: Daten werden über das Kabel übertragen, die Festplatte dreht sich, was auch immer. Sobald es nicht darauf wartet, benötigt der Code den Thread zurück, um die Arbeit abzuschließen. –

+0

Chris, danke für die gut gemachte Antwort. Aber ich bin wirklich auf der Suche nach einer Antwort, warum es in .net verwendet wird. 5. Ich verstehe, was der Unterschied zwischen async und nicht-async, aber ich möchte immer noch wissen, ob es einen Grund gibt, warum er es für Teiltöne verwendet. Laut Ihrer Antwort benutzt er (Scott Hanselman) es irgendwie falsch. – RickJames

0

In Bezug auf "erwarten Html.PartialAsync" - dieser Link kann Ihnen helfen - http://aspnetwebstack.codeplex.com/workitem/601 (folgen Sie den Kommentaren auch) (was genau war das Problem zuvor).

Ich arbeite an einer öffentlichkeitswirksamen Website, die auf MVC 6 gebaut wird und "warte auf Html.PartialAsync" ist schneller als "Html.Partial" - besonders wenn die Ansicht viele Komponenten enthält.

Das Herausnehmen des "Wartens" aus Html.PartialAsync funktioniert offensichtlich nicht und Html.PartialAsync spuckt den Typnamen aus (z. B. "System.Threading.Tasks.Task`1 [Microsoft.AspNet.Mvc.Rendering. HtmlString] ") anstelle der eigentlichen Ansicht.

5

Wie in der ASP.NET MVC-Dokumentation auf Teilansichten. https://docs.asp.net/en/latest/mvc/views/partial.html

PartialAsync Die Methode ist für die partiellen Ansichten verfügbar asynchronen Code enthalten (obwohl Code in Ansichten wird allgemein abgeraten):

auch der Hinweis auf der Seite.

Wenn Ihre Ansichten Code ausführen müssen, ist das empfohlene Muster die Verwendung einer Ansichtskomponente anstelle einer Teilansicht.

So sollten Sie Partial und vermeiden PartialAsync, und wenn Sie sich mit einem PartialAsync finden, sollten Sie sich fragen, ob Sie etwas falsch machen, sollten Sie vielleicht einen ViewComponent stattdessen oder bewegen, um die Logik aus der Sicht verwendet werden an den Controller.