2013-12-16 15 views
5

Ich habe einen synchronen Aufruf, die ich umwandeln müssen, um Asynchron, Im mit der Asynchron/erwarten Schlüsselwörter, aber diese nur zurückkehrt, sobald die Aufgabe hat, vollenden, was ich tun muss, ist, die Ergebnisse zurück auf die Benutzeroberfläche eins nach dem anderen.Async Aktionen in ASP.NET MVC 4

Das Szenario ist Ich habe eine Aufgabenliste für den Benutzer angezeigt, sobald sie authentifiziert haben, aber ich möchte die Aufgabe nacheinander geladen werden, sobald sie aus der Datenbank abgerufen wurden, hier ist meine actionResult, die die zusammenstellt Suchkriterien vorab filtern, um die Aufgaben:

public async Task<ActionResult> Index(string searchTerm = null, int page = 1) 
{ 
    Shared.InitialiseCriteria(SearchCriteria); 
    SearchCriteria.DepartmentID = DepartmentID; 
    SearchCriteria.PageSize = 15; 
    SearchCriteria.FreeText = searchTerm; 

    var model = await DoStuff(SearchCriteria); 

     if (Request.IsAjaxRequest()) 
     { 
      return PartialView("_ConversationList", model); 
     } 
    return View(model); 

} 

Und hier ist die await Aufgabe dieser GetConversation nennt, die im wesentlichen die Aufgaben erhält, wenn die erste Aufgabe gefunden ich muss es auf den Index Ansicht geladen werden:

private async Task<Result> DoStuff(CSearchCriteria SearchCriteria) 
{ 

    return GetConversations(SearchCriteria); 
} 
+0

Können Sie erklären weiter, was genau Sie passieren erwarten, und was passiert eigentlich? – sinelaw

+0

I würde die Aufgaben in der DB gefunden dergleichen in die Teilansicht einen nach dem anderen geladen werden, so wird der Benutzer nicht an einer Lade Bildschirm mit, im Moment ist es etwa 10 Sekunden für nur vier Aufgaben nimmt zu laden. Ich kann bei Bedarf weitere Informationen liefern ... – user2711252

Antwort

4

der einzige Zweck Der asynchrone Controller in ASP.NET MVC soll den IIS-Thread freigeben, um einige andere Anforderungen zu verwalten, während ein asynchroner Vorgang ausgeführt wird. Aus Sicht des Aufrufers ist es genauso, als ob Sie den Sync-Controller verwenden.

Also, ich glaube nicht, dass Sie erreichen, was Sie mit Asynchron-Controller möchten (Sie können es verwenden, aber es wird Ihr Problem nicht lösen).

Ich denke, Sie können eine Art Paging auf Server-Seite implementieren, um Teile der Daten abzurufen und über SignalR an den Client zu senden.

+0

+1. Ich habe eine Blog-Post, die erklärt, dass [ 'async' nicht das HTTP-Protokoll ändert] (http://blog.stephencleary.com/2012/08/async-doesnt-change-http-protocol.html). –

+0

@Alex Vielen Dank für Ihre Antwort könnten Sie beraten, wie ich das gewünschte Ergebnis erzielen konnte Ich habe auch versucht Threading, aber nicht sicher, wie aktualisiert/aktualisieren meine Indexansicht, sobald die erste Aufgabe aus der DB abgerufen wurde. – user2711252

+0

Ich habe eine Antwort mit meiner Meinung aktualisiert, wie es geht. –

0

Es gibt ein paar Probleme hier:

  • Wie ASP.NET verursachen, sobald Daten zu starten Rückkehr als jedes Element verfügbar ist,
  • wie der Client & Server zu koordinieren, so dass die Kunde weiß, dass ein neues Produkt verfügbar ist (dh so dass es jedes Element in der Reaktion separat analysieren kann, oder so kann es mehr Daten anfordern, wenn Sie für ‚Pull‘ gesuchte)

Wie in Antwort AlexK den erklärt, die async api doe s nicht ändern, wie der Server auf den Client reagiert. Async ermöglicht Ihrer App nur das Freigeben von Threads, wenn sie nicht verwendet werden, und erleichtert die Parallelisierung von Teilen von Anforderungen, die von mehreren Ressourcen abhängig sind.

Neben der Verwendung von SignalR, das dafür entwickelt wurde, können Sie den integrierten Mechanismus auf niedrigerer Ebene - PushStreamContent - selbst verwenden. Hier sind ein paar Blog-Posts, wie das zu tun: