2009-07-24 11 views
2

Ich habe eine ASP.NET-Seite, die zu lange zum Laden dauert. Ein kleiner Test zeigt, dass die Serverseite Protokollierung einen ziemlich großen Teil der Zeit beansprucht und (weil der Benutzer die Protokollierungsergebnisse nie sehen muss) Ich möchte es verzögern, bis die Seite geladen ist.Kann eine ASP.NET-Seite einen Teil ihrer Verarbeitung nach dem Laden der Seite ausführen?

Gibt es eine einfache Möglichkeit, dies zu tun?

Ich habe versucht, es in der Seite Disposed Event, aber das scheint nicht zu schießen und in der Unload Ereignis, aber das feuert zu früh. Ich würde lieber keinen Thread spawnen müssen, aber vielleicht kann ich das, wenn es das braucht.

Ich bin NICHT auf der Suche nach AJAX. Ich möchte eine normale vollständige Seite laden und dann, nachdem die Seite geladen hat (wie von der Client-Seite gesehen) ein wenig mehr Verarbeitung.

+0

Ich habe keine gute Antwort für Sie, aber warum dauert die Protokollierung so lange? –

+0

Heck, wenn ich weiß. Ich würde auch gerne wissen, warum das Hochladen von 40kB .DLLs mehrere Minuten in Anspruch nimmt: b – BCS

+5

Wenn Ihre Protokollierung so teuer ist, dass ein separater Prozess/Thread erforderlich ist und Sie nicht wissen, warum, wird jede Lösung, die Sie hier erhalten legte ein Pflaster auf ein gebrochenes Bein. –

Antwort

9

Dies scheint zu funktionieren:

protected void Page_Unload(object sender, EventArgs e) 
{ 
    HttpContext.Current.Response.Flush(); 
    HttpContext.Current.Response.Close(); 
    Thread.Sleep(20000); // Do processing here instead of sleeping :) 
    Debug.WriteLine("Done!"); 
} 

Sie erwähnten die Veranstaltung Unload Feuer zu früh, aber es scheint mir, dass es pünktlich ist. Sie müssen die Verbindung nur manuell schließen.Flushing scheint ebenfalls obligatorisch zu sein, was ein wenig seltsam ist, da ich dachte, dass ein Flush implizit ist, wenn man schließt.

Es kann einige Nachteile haben, da der Prozess, der die Anforderung verarbeitet, weiterhin beschäftigt ist und die nächste HTTP-Anforderung nicht verarbeitet werden kann. IIS7 hat jedoch ein konfigurierbares Limit für die Anzahl gleichzeitiger Anfragen. Du wolltest einfach, ich denke, das ist so einfach wie es wird.

+0

Das scheint gut zu funktionieren. – BCS

1

Sie suchen nach einem asynchronen Prozess. AJAX ermöglicht dies ebenso wie andere Implementierungen. Suchen Sie nach Async und ASP.Net und Sie werden eine Menge Ressourcen finden.

Grundsätzlich startet Ihre Webseite und führt Prozesse in einem separaten Thread aus, während die Benutzeroberfläche weiter gerendert wird.

+1

Ich kenne AJAX und es ist nicht das, wonach ich suche. Wie für ASP.NET + Async, bekomme ich Töne von Ergebnissen für die asynchrone Ausführung der Aufgabe * während die Seiten geladen werden * und nicht danach. – BCS

+1

Siehe Bearbeiten: Das Problem ist Server-Seite, nicht Client-Seite. – BCS

+0

Also, warum nicht lassen Sie die Seite vollständig laden dann einen Ajax-Prozess kicken, die Ihren Server aufruft, um zu loggen oder was auch immer andere Methode, die Sie wollen? AJAX ist ein Async-Prozess, der beliebige serverbasierte Methoden aufrufen kann. – Jay

1

Versuchen Sie, Flush auf dem Antwortstream aufzurufen, bevor Sie sich anmelden. Entladen wird erst ausgelöst, nachdem die gesamte Antwort gesendet wurde. Wenn Sie dort() Flush() und dann log, sollte es das letzte sein, was die Seite tut.

Der Effekt sollte sein, dass der Benutzer die Seite sieht, aber das Laden nicht abgeschlossen ist, bis das Protokoll fertig ist. Aber sie können mit der Seite interagieren, also wird es ihnen wahrscheinlich egal sein.

+0

Dies funktioniert möglicherweise nicht bei allen Browsern (abhängig davon, wie sie gepuffert sind) und/oder lässt den Status des Browsers etwas in Richtung "Laden ..." sagen. –

+0

Klingt so, als könnte es funktionieren. Kann ich das sicher mit 'Page_Load' machen? (/ Ich gehe googlen für wie man den Antwortstrom bekommt) – BCS

+0

Response.Flush sendet den Inhalt an den Client, wie es gerendert wird, seien Sie vorsichtig damit, denn wenn Ihre Protokollierung den Prozess verlangsamt, dann wird die Seite scheinbar langsam geladen an Ihre Kunden, wenn die Protokollierung für diesen Abschnitt abgeschlossen ist. Stücke auf einmal. – Jay

1

Dies ist mit asynchronen Threads möglich. Wir haben eine Seite für einen Kunden erstellt, die alle 2 Minuten überprüft, ob es ein Update gibt und falls ja, haben wir die Seite aktualisiert.

Vielleicht wird dies Howto Ihnen helfen:

http://www.eggheadcafe.com/articles/20060918.asp

Hoffnung Sie

0

Statt es von der Anmeldung in Ihrem Log helfen könnte, einen String draus machen (mit String) und gegen Ende Schieben Sie die gesamte Zeichenfolge in Log.

Sie können die Protokollierung verlieren, wenn die Seite aufgrund einer Ausnahme nicht geladen werden kann.
Verzeihung, wenn ich das Problem nicht richtig verstanden habe.

+0

Wie es passiert, logge ich nur am Ende nur ... – BCS

+0

Ich denke, HttpModule könnte von Nutzen sein. d. h. diejenigen, die ausgeführt werden, nachdem die Anforderung abgeschlossen ist. Nicht sicher, ob es sich gut auf Ihren Fall bezieht. – shahkalpesh

0

Welche Art von Protokollierung ist es und wo geht es hin?

Eine Möglichkeit kann es sein, einen anderen Thread auszuwechseln (Sie müssten die Anzahl der für asp.net verfügbaren Threads erhöhen) und die Anmeldung dort durchführen. Sie können den ParameterizedThreadStart verwenden und ein Objekt übergeben, das für die Protokollierung verwendet werden soll. (Verwenden Sie keine Datenbankverbindung/Befehl-Objekt übergeben, obwohl so schlimm sein würde!)

3

Haben Sie darüber nachgedacht, einen Protokollierungsdienst zu erstellen, der eine Protokollwarteschleife erstellt und die Protokollierung in seinem eigenen Thread durchführt?

Mit dieser Funktion können Sie die gesamte Protokollierung an der Stelle, an der sie sich zuvor im Code befanden, belassen und nur asynchrone Aufrufe an die Protokollierungsmethoden vornehmen.

+0

Ein bisschen komplizierter als Thorarin Lösung, aber immer noch eine Option. – BCS

+0

Oder versuchen Sie eine Kombination: Thorarin Lösung + rufen Sie die Protokollierungsmethode in einem separaten Thread, so dass Ihre Anfrage aus Sicht von IIS abgeschlossen werden kann. –

Verwandte Themen