Laden...

Asynchrone Webseiten

Erstellt von AlfameisterT vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.593 Views
A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 17 Jahren
Asynchrone Webseiten

Hallo,

ich stehe vor einem kleinen Problem.
Vielleicht habt ihr hierzu ähnliche Erfahrungen gemacht und könnt mir hilfreiche Tipps geben.

Ich habe einen Prozess der eine längere Zeit in Anspruch nimmt.
Um dem Benutzer das Gefühl zu geben, dass sich da noch was tut, wollte ich eine Statusanzeige implementieren.

Da ein Request aber erst zurückkehrt wenn er fertig bearbeitet ist, dachte ich mir ich baue eine Seite mit 2 Frames. In dem einen Frame wird die Verarbeitung mit anschließender Ergebnisanzeige gestartet, im anderen Frame eine Statuseinzeige. Dazu startet die Seite im 2.Frame nach 3sec einen Reload und gibt einen Status aus.

Die Statusinformationen des Prozesses lege ich in der Session ab, damit beide Request einen gemeinsammen Nenner haben.

Soweit so gut, nur funktioniert das nicht. Der Webserver verarbeitet anscheinend immer nur einen Request. Auch das Asnc Attribute aus dem .net 2.0 hilft da nicht weiter, da die Seite dennoch wartet bis die Verarbeitung fertig ist, und somit wieder nur ein Request auf einmal verarbeitet wird.

Der 2. Gedanke war, ich starte einen Request, hier starte ich einen Thread der nicht im Threadpool liegt und lasse die Verarbeitung durchführen. Die Statusinformationen lege ich in der Session ab.

Dieses funktioniert. Der eigene Thread arbeitet und wenn er fertig ist, stoppe ich die Reloads und gebe das Ergebnis aus.

Hier habe ich dich Angst das eine vielzahl von Benutzer, somit eine vielzahl von Thread zu einem unvorhergesehenen Problem führen.

Nun meine Frage: Zur Methode 1 mit 2 Frames, liegt das verhalten an dem Webserver welcher Visualstudio 2005 aufsetzt? Es wird immer nur ein Request bearbeitet.

Zur Methode 2: Kann der Server durch eine Vielzahl von Thread instabil werden, bzw. wie kontrolliert man das am besten?

Oder anders gesagt, wie lößt man das am besten?

308 Beiträge seit 2005
vor 17 Jahren

Um was für eine Art prozess handelt es sich denn?
Schon mal über AJAX bzw. System.Web.UI.ICallbackEventHandler und Page.ClientScript.RegisterClientScriptBlock etc. nachgedacht..
Damit geht sowas wunderbar.

A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 17 Jahren

Es wird ein Worddokument erstellt. Denke mal das es bis zu 2Minuten dauern kann bis das Dokument fertig ist.

Das mit dem Callback und Clientscript funktioniert bereits. Nur wird anscheinend jeder weitere Request erst verarbeitet wenn kein Request mehr offen ist.
So das Ergebnis mit der Statusseite welche sich permanent refreshed und Status ausgibt/geben soll.

308 Beiträge seit 2005
vor 17 Jahren

Er... irgendwi scheinst du das mir dem ICallbackEventHandler noch nicht so ganz richtig im Griff zu haben.

Eigentlich sollte das so ablaufen:
User lädt ASPX-Seite, diese registriert beim laden ein ClientScript für den Asnychronen Aufruf ("BeginInvoke") deiner Background-Aktivität und ein ClientScript ("Done") das aufgerufen wird sobald diese Aktivität beendent ist.

NACH dem laden der ASPX Seite wird das "BeginInvoke" Script aufgerufen (onload oder interaktive per Button)

  • eine "in progress" notifikation wird per javascript eingeblendet (div oder so)

"BeginInvoke" ruft (beim IE über XmlHTTPRequest) asynchron die serverseitige Funktion für "BeginInvoke" invoke der ASPX-Seite auf (ICallbackEventHandler.RaiseCallbackEvent).

Sobald RaiseCallbackEvent durch ist wird "Done" auf der HTML-Seite mit dem Ergebnis aus ICallbackEventHandler.GetCallbackResult aufgerufen.

  • eine "in progress" notifikation wird per javascript ausgeblendet (oder evtl auch eine Fehlermeldung eingeblendet)

Relativ verwirrend alles... Ich hoffe, dass das mit Atlas besser wird. Aber funktionieren tut das klasse.

Ich habe eine Seite, die etliche counter und Vorgänge so live (ohne refresh) aktualisiert.

Dafür braucht man nicht einmal Sessions.

25 Beiträge seit 2005
vor 17 Jahren

Hallo cadi,

hast du ein kleines Beispiel für diesen Callback und der Fortschrittsanzeige? Diese Frage kam hier immer wieder auf allerdings hat nie jemand Code bereitgestellt an dem man das Ganze nachvollziehen kann. Vielleicht kannst du ja deinen Code zippen oder einen Gerüst bereitstellen um die Technik zu veranschaulichen. Mir würde es auf jeden Fall weiterhelfen.