2012-04-02 38 views
1

Ich habe eine Funktion, die viel Zeit in einer Webanwendung benötigt. Also entschied ich mich, einen Thread dafür zu erstellen.Etikett nach dem Laden der Seite aktualisieren

Thread t = new Thread(getEventErrors); 
      t.Start(); 

Die Funktion berechnet einen Wert und wendet ihn in einem Label an.

Dies ist ein Problem, weil in asp.net die Seite einmal geladen und das Etikett bis dahin nicht aktualisiert wird.

Wie implementiere ich dies mit dem AJAX?

Gibt es einen Weg, auf dem die Seite geladen wird und nachdem der Wert berechnet wurde, wird die Bezeichnung aktualisiert?

Jeder Beispielcode wird sehr geschätzt.

Dank

private void getEventErrors() 
    {   
     EventLog eventLog = new EventLog("Application", "."); 

     getEvents(eventLog.Entries); 
    } 

private void getEvents(EventLogEntryCollection eventLogEntryCollection) 
    { 
     int errorEvents = 0; 

     foreach (EventLogEntry logEntry in eventLogEntryCollection) 
     { 
      if (logEntry.Source.Equals("Application Name")) 
      { 
       DateTime variable = Convert.ToDateTime(logEntry.TimeWritten); 
       long eventTimeTicks = (variable.Ticks); 
       long eventTimeUTC = (eventTimeTicks - 621355968000000000)/10000000; 

       long presentDayTicks = DateTime.Now.Ticks; 
       long daysBackSeconds = ((presentDayTicks - 864000000000) - 621355968000000000)/10000000; 


       if (eventTimeUTC > daysBackSeconds) 
       { 
        if (logEntry.EntryType.ToString() == "Error") 
        { 
         errorEvents = errorEvents + 1; 
        }       
       } 
      } 
     } 
     btn_Link_Event_Errors_Val.Text = errorEvents.ToString(GUIUtility.TWO_DECIMAL_PT_FORMAT);    
     if (errorEvents == 0) 
     { 
      lbl_EventErrorColor.Attributes.Clear(); 
      lbl_EventErrorColor.Attributes.Add("class", "green"); 
     } 
     else 
     { 
      lbl_EventErrorColor.Attributes.Clear(); 
      lbl_EventErrorColor.Attributes.Add("class", "red"); 
     }    
    } 

Dies ist der Code .. aber ich will mit Ajax der ganzen langer Zeit raub Code zu handhaben.

Zum Beispiel sollte die Seite schnell geladen werden und die lange Funktion sollte im Thread mit einem Warte-Cursor geladen werden, wenn der Wert erhalten wird, wird es in der Beschriftung oder einem anderen Steuerelement angezeigt.

+0

Wie lange Zeit? 5 Sekunden oder 5 Minuten? – Aristos

+0

Sie sollten beginnen, die Datenbank Query/Page Events usw. zu optimieren, um nach Threads zu gehen. Es braucht viel Speicher. – Pankaj

+0

@Aristos: es dauert 7 -8 Sekunden, um die erste Seite zu laden, und wenn ich die Funktion entferne, dauert es 3 - 4 Sekunden. – user175084

Antwort

1

Es gibt keine Möglichkeit, dass der Server einige Daten sendet, nachdem die Antwort mit einem "Update" gesendet wurde. Eine Spontaneitätsanforderung, die vom Server an einen Client gesendet wird, wird einfach ignoriert.

Ihr Client muss eine Anfrage an den Server senden, nachdem die Seite geladen wurde (was JavaScript-Code bedeutet), um zusätzliche Daten anzufordern, mit denen Sie dann die Seite aktualisieren können.

Die beste Methode, die ich denken könnte wäre, einen Web-Service/Web-Methode mit den Daten im Formular zu machen, oder eine ICallbackEventHandler machen (ich möchte lieber mit diesen arbeiten), die Sie die Daten anfordern können etwas JavaScript-Methode. An dieser Stelle können Sie entweder diese Webmethode einrichten, um genau diese Daten zu berechnen, oder Sie können den Thread wie gewohnt hochfahren und die Sitzung verwenden. Dies würde bedeuten, dass der andere Thread die Daten berechnet und sie beim Laden der Seite in der Sitzung speichert und dann die JavaScript-Methode den Wert aus der Sitzung abruft. Die letztere Methode ist etwas fragiler. (Wenn sie die Seite zum Beispiel mehrmals in verschiedenen Browsern/Tabs gleichzeitig treffen.) Wenn der Sitzungswert noch nicht gefüllt ist, müssen Sie entweder den Thread blockieren (schlechte Idee) oder lassen Sie die JavaScript-Methode wiederholt abfragen, bis der Sitzungswert aufgefüllt ist.

Verwandte Themen