2012-03-28 76 views
1

我有一個功能,它需要花費大量的時間在Web應用程序中執行。處理花費很多時間的函數線程

我已經用探查器和我的日誌記錄測試過了。

我有其他功能在同一頁面加載運行。

什麼是最好的方式來顯示這些函數的其餘值,並保持此函數在一個線程中,並在它完成後顯示在標籤中?

此函數用於獲取需要時間的應用程序中的事件。

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

我在頁面加載事件3層的功能,兩到從DB獲取值,而另一個如上所示。

這兩個函數應該是服務調用嗎?

我想要的是,頁面加載速度很快,如果有一個函數花費很多時間,它應該在後臺運行,並在完成時顯示,如果用戶想要導航到新頁面,應該殺死它並繼續前進。

+1

如何將它移動到它所屬的服務並進行AJAX調用? – 2012-03-28 20:47:45

+0

把它移到一個服務..?對不起,但你能不能更清楚,因爲我是新手。我還沒有開始實施AJAX。一個例子會很有幫助。 Thnaks – user175084 2012-03-28 20:51:51

回答

2

如果您有一個在ASP.NET的單獨線程中運行的函數,則可能需要考慮將其移動到服務中。這有很多原因

請參閱this答案(這是許多人之一)爲什麼在ASP.NET中運行長時間運行的任務並不總是一個好主意。

該服務的一個選項是使用WCF。你可以開始here。你的服務可以實現一個方法,比如說GetEvents(),你可以用它來拉你的事件。這樣你就不會束縛你的頁面等待這個過程完成(當然使用AJAX)。此外,這允許您更改您的GetEvents()的實施,而無需觸摸您的網站上的代碼。

+0

但是調用服務方法需要等待時間。 – Pankaj 2012-03-28 21:29:00

+0

我在pageload事件中有3個函數,其中兩個從DB獲取值,另一個在上面顯示。這兩個函數都應該是服務調用。我想要的是,頁面加載速度很快,如果有一個函數需要花費很多時間,它應該在後臺運行並在完成時顯示。在這個過程中,如果用戶想要導航到一個新的頁面,它應該殺死它並繼續前進。 – user175084 2012-03-28 22:31:51

+0

您應該考慮將記錄請求移至服務。您也可以考慮使用某種類型的分頁或機制來檢索較少量的條目。你真的需要同時查看它們嗎? – 2012-03-28 23:36:22