Wie zeigen Sie die asynchronen Ergebnisse an, die in der asp.netweb-Anwendung am Anfang stehen?

8

Ich muss drei asynch Anforderungen in drei Klassen-Dateien senden, 3 Anfragen Reaktionszeiten sind unterschiedlich, erste ist 2sec und zweite ist 7sec und dritte ist 4sec, jetzt muss ich erste Antwort im Browser mit anzeigen in 2sec und nach 2sec Anzeige die dritte Antwort und schließlich die zweite Antwort, aber jetzt meine Ergebnisse alle Antworten zu einem Zeitpunkt nach drei Antworten, bitte geben Sie mir einen Vorschlag, es ist sehr dringend, bitte ... ..

Mein Code ist

%Vor%

Schaltfläche klicken Ereignis

%Vor%

danke dir hemanth

    
hmk 18.06.2012, 10:19
quelle

1 Antwort

5

Ich denke, der Grund des Problems besteht darin, zu verstehen, was mit einer ASP.Net-Anfrage passiert.

Jede Seite hat ihren Lebenszyklus, der eine Pipeline von Ereignissen enthält. Weitere Informationen finden Sie in dieser Antwort . Jede Anfrage wird von einem Arbeitsthread aus der Anwendungsdomäne der aktuellen Anwendung bearbeitet. Die Antwort wird nicht an den Benutzer gesendet, bis die Seitenpipeline abgeschlossen ist.

Über Themen:

Die Anzahl der gleichzeitig verfügbaren Threads kann in machine.config konfiguriert werden. Der entscheidende Punkt ist, dass diese Anzahl von Threads fest ist, was bedeutet, dass wenn die maximale Anzahl gleichzeitiger Threads erreicht wurde, nachfolgende Anfragen in eine Warteschlange gestellt werden, die Anzahl der Anfragen, die in die Warteschlange gestellt werden können, sind nur begrenzt durch den Speicher des Servers.

Wenn ein Worker-Thread eine lange zeitaufwendige Operation aufruft, blockieren Sie diesen Thread, bis der Vorgang abgeschlossen ist. Das bedeutet wiederum, dass bei mehreren gleichzeitigen Benutzern möglicherweise alle verfügbaren Threads blockiert werden und neue Anforderungen erzwungen werden in eine Warteschlange gestellt und im schlimmsten Fall einen Fehler 503 - Service nicht verfügbar.

Um dies zu verhindern, rufen Sie diese Methoden in Hintergrundthreads auf. Ähnlich wie Ihr Code , aber das Verhalten ist nicht das, was Sie in diesem Fall erwarten. Ihr Code wartet darauf, dass die Threads enden, um die Seitenanforderung zu beenden Grund, dass Sie das Ergebnis zur gleichen Zeit erhalten (am Ende der Anfrage).

Weitere Informationen zum asynchronen Ausführen von ASP.net-Seiten finden Sie in diesem ausgezeichneten Artikel < / a>

Um nun die Ergebnisse zu erhalten, brauchen Sie:

(Dies ist ein vollständig funktionierendes Beispiel, in diesem Beispiel verwende ich Rx - Reaktive Programmierung um lange zeitraubende Methoden in einem neuen Thread auszuführen, können Sie dies ändern, um ein anderes Framework zu verwenden, wenn Sie möchten, ich bevorzuge Rx, weil ich mich wohler mit der API fühle)

Verwenden von PageMethods

Code hinter

%Vor%

ASPX

%Vor%

Ausgabe

Dieser Code generiert Folgendes:

%Vor%

Wie Sie sehen, ist der Code nicht optimiert, der Hauptthread wird gesperrt, die maximale Anzahl von Sekunden, die wir einrichten, ist 7, aber in diesem Fall ab dem Zeitpunkt, zu dem der Servercode aufgerufen wurde (02:11:17) bis zur letzten Antwort (2:11:30) sind 13 Sekunden vergangen. Dies liegt daran, dass ASP.Net standardmäßig das aktuelle Objekt Session sperrt, das den Haupt-Thread sperrt. Da wir die Sitzung in diesem Beispiel nicht verwenden, können wir die Seite wie folgt konfigurieren:

%Vor%

Und die neue Ausgabe ist:

%Vor%

Nun sind vom ersten Servermethodenaufruf bis zur letzten erhaltenen Antwort nur 7 Sekunden vergangen, ohne den Hauptthread zu sperren =)

Bearbeiten 1

Wenn mein Verständnis stimmt, müssen Sie einige Parameter an die Methoden übergeben und Datensätze zurückgeben, um Beschriftungen und Textfelder zu füllen.

Um Parameter an die PageMethods zu übergeben, ist dies eine Möglichkeit:

Installieren Sie dieses Nuget-Paket:

Befehlsklasse Diese Klasse stellt die Parameter dar, die Sie in der Post-Aktion an die Servermethode senden möchten

%Vor%

Anstatt ein DataSet zurückzugeben, denke ich, dass es einfacher und überschaubarer wäre, ein IEnumerable zurückzugeben, etwa so:

%Vor%

Die Klasse MyResult repräsentiert die Daten, die Sie an den Benutzer zurücksenden möchten

%Vor%

Auf Ihrer ASPX-Seite

%Vor%

Bearbeiten 2

Dies ist ein vereinfachter Weg

%Vor%

Code hinter

%Vor%

Ausgabe

    
Jupaol 22.06.2012, 05:14
quelle

Tags und Links