0

Ich entwickle einen Asp Net MVC Client, der Asp Net Web Api verwenden wird. Und ich muss mich entscheiden, wie ich meine Anwendung besser gestalten kann. Nachdem ich eine Weile im Internet gesucht hatte, fand ich Leute, die vorschlugen (zum Beispiel here), MVC-Aktionsmethoden asynchron zu machen. Ich fand auch heraus, dass der Hauptvorteil von asynchronen Aktionsmethoden die Skalierbarkeit des Servers ist, d. H. Der Server wird in der Lage sein, mehr Anfragen zu bedienen. Es gibt jedoch eine Sache, die Web-API, die ich konsumiere, hat synchrone Aktionsmethoden und wird auf demselben Server laufen. Also meine Vermutung ist, dass es keine Vorteile für mich gibt, asynchrone Aktionsmethoden für meine MVC zu implementieren, denn selbst wenn meine MVC-Aktionsmethoden asynchron sind und der Server am Ende aus der "MVC-Sicht" skalieren kann, werden diese Methoden konsumieren immer noch synchrone Web-API-Methoden, und aus diesem Grund wird der Server "unweigerlich" aus seinem Thread-Pool ausgehen. Vielleicht fehlt mir etwas oder es gibt andere Vorteile von asynchronen Aktionsmethoden?Gibt es Vorteile der Verwendung asynchroner Aktionsmethoden in Asp Net MVC-Anwendungen, die Asp Net Web Api mit synchronen Aktionsmethoden verbrauchen?

Hier ist ein sehr einfaches Beispiel-Code schrieb ich Ihnen besser machen mein Problem zu verstehen:

Dies ist die Web api Controller:

public class UsersController : ApiController 
{ 
    private readonly IUserService _userService; 
    public UsersController(IUserService userService) 
    { 
     _userService = userService; 
    } 

    // As you can see this method is not asynchronous 
    public User Get(int id) 
    { 
     return _userService.GetUserById(id); 
    } 
    // some other code 
} 

Dies ist der Mvc-Controller ist, ich habe zwei Möglichkeiten, wie meine Aktionsmethoden entwerfen:

public class UsersController : Controller 
{ 
    // A) Make simple synchronous action methods 
    public ActionResult UserPageSync() 
    { 
     IUserWebServiceSync userWebServiceSync = new UserWebServiceSync(); 
     User user = userWebServiceSync.GetUserById(1); 

     return View(); 
    } 

    // B) Make asynchronous action methods 
    public async Task<ActionResult> UserPageAsync() 
    { 
     IUserWebServiceAsync userWebServiceAsync = new UserWebServiceAsync(); 
     User user = await userWebServiceAsync.GetUserByIdAsync(1); 

     return View(); 
    } 
} 
+1

Async und Sync-Methoden ist in Ordnung. Ich würde warten, bis Sie ein Problem mit der Leistung Ihrer Anwendung haben, bevor Sie sich darüber Gedanken machen. Wenn Sie viele asynchrone Methoden verwenden, bedeutet dies, dass Ihre Anforderungen z. B. an eine Datenbank gesendet werden, um Informationen zu erhalten, und die Anforderungen schneller an Ihre Datenbank gesendet werden, als wenn Ihre Methoden synchron wären. Dies bedeutet, dass Ihre Datenquelle eher der Flaschenhals als Ihre eigentliche Anwendung ist. Ich würde vorschlagen zu sehen, wie es geht, profilieren Sie Ihre Anwendung, wenn Sie Probleme haben und entscheiden Sie den besten Weg von Fall zu Fall. – Luke

+0

@Luke Implizieren Sie, dass, wenn ich die Web-API zweimal oder mehr in einer MVC-Methode aufgerufen wird, die Anfragen schneller gesendet werden, wenn die Methoden asynchron sind? Und würden Sie sagen, dass es besser ist, sie für jetzt asynchron oder synchron zu machen? –

+0

Ich denke, Sie könnten verwirren, was WebAPI ist, würden Sie WebAPI nicht von einer Aktionsmethode aufrufen. Ihre Webseite kann jedoch WebAPI über Javascript aufrufen. Ja, wenn Ihre WebAPI-Methode als Async auf dem gesamten Aufruf-Stack definiert ist, einschließlich eines asynchronen Datenbankaufrufs, werden die UI-gebundenen Threads für die Verwendung durch andere Aufrufer freigegeben, wenn diese Methode zweimal hintereinander aufgerufen wird Theoretisch ist es weniger wahrscheinlich, dass Aufrufe an Ihre Datenbank durch einen Mangel an Threads blockiert werden, daher werden sie Ihre Datenbank je nach Auslastung schneller treffen. – Luke

Antwort

3

die Web-api ich muss Methoden synchrone Aktion aufwendig und wird auf dem sa laufen ich Server

Dies ist ein sehr ungewöhnliches Design. Aber ich werde das ignorieren.

Sie können so über Folgendes nachdenken: Wenn die MVC-Aktionen synchron sind, benötigen sie zwei Threads pro Anfrage (eine für die MVC-Aktion, eine für die WebAPI-Aktion). Wenn die MVC-Aktionen asynchron sind, nehmen sie 1 Thread pro Anfrage (keine für die MVC-Aktion, eine für die WebAPI-Aktion). Es ist also immer noch ein klarer Vorteil, Async auf Ihren MVC-Aktionen auszuführen.