2014-03-26 9 views
7

Ich schreibe eine kleine interne Web-App. Ich muss eine sehr lange Operation (die etwa eine Stunde dauern kann) auf Knopfdruck machen und den Benutzer wissen lassen, sobald der Vorgang mit seinem Ergebnis abgeschlossen ist.Aktualisieren der Ansicht mit asynchroner Operation in MVC

Mit anderen Worten, ich brauche die Schaltfläche, um den asynchronen Vorgang zu starten und die Ansicht mit den Ergebnissen zu aktualisieren, sobald es fertig ist (nach etwa einer Stunde ausgeführt).

Bearbeiten: Die Operation könnte eine Art von einem Refresh-Mechanismus in der Ansicht verwenden. Das Ergebnis kann nach einer kleinen Verzögerung zur Ansicht geschickt wird (muss nicht in Echtzeit aktualisieren)

+3

Vielleicht können Sie über WebSockets-Implementierung (SignalR) in diesem Fall denken –

+0

Werfen Sie einen Blick auf [async erwarten] (http://msdn.microsoft.com/en-us/library/hh191443.aspx), klingt wie Es könnte tun, was Sie wollen. – markpsmith

+0

ASP.NET und IIS wurden nicht für so lange Operationen erstellt. Sie sollten Ihre Arbeit an einem anderen Ort veröffentlichen (ein Windows-Dienst?) Und die Seitenabfrage durchführen lassen. –

Antwort

-1

Ähm,

Ich versuche, werde Flag in den Server zu erstellen, wenn die Arbeit beendet. In der MVC können Sie ein TIMER-Objekt erstellen, das zum Beispiel jede Minute überprüft, ob der Server die Arbeit beendet hat, und diesen Timer in einem neuen Thread starten, der die App nicht blockiert.

(Entschuldigung, für mein Englisch).

0

Wie in den Kommentaren empfohlen, empfehle ich Ihnen, einen Blick auf SignalR zu werfen, es ist nicht so schwer zu implementieren.
Sie müssen einen Server auf Ihrer Website implementieren, eine Nachricht an den Server senden, wenn Ihr langer Vorgang abgeschlossen ist, und Ihre Ansicht aktualisieren, wenn die Nachricht empfangen wird.
Die Lernprogramme von Microsoft sollten klar genug dafür sein.

3

Sie könnten SignalR verwenden, aber das könnte ein wenig Overkill dafür sein. Eine andere Möglichkeit besteht darin, eine weitere Controller-Aktion einzurichten, die prüft, ob die Task abgeschlossen wurde. Auf der Clientseite können Sie dann jQuery verwenden, um Anfragen an diese Controlleraktion zu senden. Wenn die Aktion abgeschlossen ist, können Sie eine Warnung anzeigen oder die Seite anderweitig aktualisieren.

$.ajax({ 
    type: 'GET', 
    url: http://mysite.info/tasks/checkComplete/5, 
    success: function (response) { 
     if (response == 'true') { 
      alert('Task complete'); 
     }   
    } 
}); 

Als für das, was auf der Serverseite passiert, ich glaube nicht, das ist ein Fall, wo ich async/await verwenden würde. Wenn Ihre Aufgabe wirklich für eine Stunde läuft, habe ich das Gefühl, dass Sie Probleme mit Zeitüberschreitung usw. bekommen. Ich würde eine Controller-Aktion haben, die verwendet wird, um die Aufgabe zu starten, aber alles, was sie tut, stellt die Anfrage um in der Datenbank zu starten. Ich hätte dann einen externen "Arbeiter", der nach Anfragen in dieser Datenbank sucht und die Aufgaben ausführt. Sobald die Aufgabe abgeschlossen ist, würde sie diesen Datenbankeintrag aktualisieren, um ihn als abgeschlossen zu markieren. Dann könnte die Controller-Aktion "CheckComplete" aus meinem obigen Beispiel die Datenbank überprüfen, um zu sehen, ob die Aufgabe tatsächlich abgeschlossen ist.

0

Eine Low-Tech-Lösung aus der Zeit vor AJAX und WebSockets bestand darin, einfach kontinuierlich Daten in die Antwort zu schreiben (normalerweise einen Fortschrittsbericht).

Anstatt also die Arbeit asynchron zu tun, würden Sie so etwas wie

Response.Write("<script>reportProgress(" + progress + ");</script>"); 
Response.Flush(); 

hin und wieder aufrufen. Es hat seine Probleme, aber es könnte immer noch ein guter Weg sein, wenn Sie seltsame Plattformen oder sehr alte Browser unterstützen müssen.

Verwandte Themen