Ich benutze asp.net web api 2 und Entity Framework 6.
Ursprünglicher Pseudocode
%Vor%Modifizierter Code
%Vor%Vor meiner Änderung lief alles synchron.
Nach meiner Änderung wird der Aufruf an einen Remote-Dienst, der erneut eine Datenbank aufruft, auf async-await-Art ausgeführt.
Dann mache ich einen Synchronisierungsaufruf an eine Rendering-Bibliothek, die nur Synchronisierungsmethoden anbietet. Die Berechnung dauert 1,5 Sekunden.
Gibt es noch einen Vorteil, dass ich den remote database_service den async-awaward-Weg aufgerufen habe, aber der 2. Aufruf nicht? Und kann ich mich noch verbessern?
Hinweis
Der Grund warum ich das frage ist, weil:
"Bei asynchronen Controllern wartet der Prozess, wenn ein Prozess auf den Abschluss der E / A-Verarbeitung wartet, auf den Server, der für die Verarbeitung anderer Anforderungen verwendet werden kann."
Wenn also der erste remote database_service-Aufruf die 1 Sekunde lang verarbeitet und wartet, wird der Thread an IIS ?? !!
zurückgegebenAber wie sieht es mit der zweiten Etikettenberechnung aus, die 1,5 Sekunden dauert, um den aktuellen Faden für 1,5 Sekunden erneut zu blockieren?
Also lasse ich den Thread los und blockiere das, das macht keinen Sinn oder was denkst du?
Die Rendering-Bibliothek blockiert nicht einfach einen Thread, sondern arbeitet mit dem Rendern. Es gibt nichts Besseres, was Sie tun können.
Gibt es noch einen Vorteil, dass ich den remote database_service-Aufruf ausgeführt habe? der async-wait-weg aber der 2. anruf nicht?
Ja, dieser Aufruf ist jetzt nicht blockierend und kann neben anderem Code ausgeführt werden, obwohl er nur 1 Sekunde lang ist.
Und gibt es irgendetwas, was ich noch verbessern könnte?
Wenn der zweite Aufruf auch asynchron ausgeführt werden kann, kann die gesamte Methode asynchron ausgeführt werden und blockiert überhaupt nicht.
Asynchroner Code erzeugt eine gewisse Fortsetzung unter der Haube, es ist eine Art synthetischer Zucker, der die asynchrone Programmierung synchro- nischer macht.
Im Allgemeinen kann es abhängig von den Operationen selbst hilfreich sein, beide lange laufenden Aufgaben asynchron zu machen. Es würde verschiedene Aufgaben unter der Haube für jede andere lang andauernde Aufgabe verwenden und sie asynchron ausführen.
Im Moment laufen diese Aufgaben völlig synchron innerhalb von GetProductLabel ab, was bedeutet, dass Sie, wenn es die einzige Methode ist, die Sie aufrufen, nicht den Unterschied zwischen synchronem Code feststellen würden.
Wenn es möglich ist, würde ich die zweite Methode async machen, da ich mit irgendwelchen signifikanten Nachteilen der Verwendung von Aufgaben und Async nicht vertraut bin.
In Ihrem Fall gibt es nichts besseres, was Sie tun können, und es wird keinen großen Unterschied machen, da Sie es synchron ausführen müssen, da Sie das Ergebnis der ersten Methode verwenden.
Tags und Links c# asp.net async-await asynchronous asp.net-web-api2