2012-04-02 2 views
1

У меня есть функция, которая занимает много времени в веб-приложении. Итак, я решил создать для него нить.обновить ярлык после загрузки страницы

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

Функция вычисляет значение и применяет его на этикетке.

Это проблема, потому что в asp.net страница загружается один раз, и метка не обновляется до тех пор.

Как реализовать это с помощью AJAX?

Есть ли способ загрузки страницы и после вычисления значения обновляется метка?

Любой образец кода будет высоко оценен.

Благодаря

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"); 
     }    
    } 

это код .. но я хочу, чтобы обрабатывать все долгое время потребляющих кода с помощью Ajax.

Например, страница должна загружаться быстро, а длинная функция должна поддерживать загрузку в потоке с помощью курсора ожидания, когда значение получает, оно отображается на этикетке или любом другом элементе управления.

+0

как долго? 5 секунд или 5 минут? – Aristos

+0

Вы должны начать оптимизацию базы данных Query/Page Events и т. Д. Instedad для перехода к потокам. Это занимает много памяти. – Pankaj

+0

@Aristos: для загрузки первой страницы требуется 7 -8 секунд, и если я удалю функцию, она займет 3 - 4 секунды. – user175084

ответ

1

Невозможно отправить серверу некоторые данные после отправки ответа с «обновлением». Запрос на спонтанность, отправленный сервером клиенту, просто игнорируется.

Ваш клиент должен будет отправить запрос на сервер после загрузки страницы (что означает код JavaScript), чтобы запросить дополнительные данные, которые вы можете обновить на странице.

Лучший способ, о котором я могу думать, - сделать веб-сервис/веб-метод с данными в форме или сделать ICallbackEventHandler (мне больше нравится работать с ними), что позволяет запрашивать данные из некоторый метод JavaScript. Теперь на этом этапе вы можете настроить этот веб-метод для расчета только этой части данных по запросу или вы можете развернуть поток, как вы делаете, и использовать сеанс. Это означает, что другой поток вычисляет данные и сохраняет их в сеансе на загрузке страницы, а затем метод JavaScript получает значение вне сеанса. Последний метод немного более хрупкий. (Если они попадают на страницу несколько раз в разных браузерах/вкладках одновременно). Кроме того, если значение сеанса еще не заполнено, вам нужно либо заблокировать поток (плохая идея) или повторите опрос метода JavaScript до тех пор, пока значение сеанса не будет заполнено.