2014-05-21 104 views
1

從事件日誌類的文檔中,EventLogEntryCollection是事件日誌條目的動態列表。它建議直接使用Count屬性,而不是將其值存儲在變量中。實施此行爲:C#動態列表到靜態列表

private void ReadEventLog() 
{ 
    EventLog eventLog = new EventLog("Application", "TheGreatestMachineInTheWorld"); 
    EventLogEntryCollection eventLogEntries = eventLog.Entries; 
    for (int i = 0; i < eventLogEntries.Count; i++){ 
     EventLogEntry entry = eventLog.Entries[i]; 
     //Do Some processing on the entry 
} 

大型事件日誌(> 20000條目)速度較慢。 for循環而不是foreach的原因是因爲我需要迭代器位置來指示這個事情要結束多久。

存儲計變量並遍歷是:

int eventLogEntryCount = eventLogEntries.Count; 
for (int i = 0; i < eventLogEntryCount; i++){ 
     EventLogEntry entry = eventLog.Entries[i]; 
     //Do Some processing on the entry 
} 

提供顯着的性能提升。但是,如果在處理髮生時正在寫入事件日誌,則會導致索引超出範圍異常。有沒有一種方法來靜態存儲這個列表,所以計數不會改變?

+0

正在寫入'eventLog'對象還是正在運行程序時正在寫入機器事件日誌? –

+0

這將是機器事件日誌 – Dudemanword

回答

4

有沒有一種方法來靜態存儲這個列表,所以計數不會改變?

這聽起來像你想要的東西,如:

List<EventLogEntry> entries = eventLogEntries.Cast<EventLogEntry>().ToList(); 

這將獲取所有(當時)的日誌條目爲List<T>,那麼這將是快速訪問或者與索引或與另一個foreach

當然,您可能會發現它的速度很慢,只需所有日誌條目 - 您應該嘗試一下。

+0

我會嘗試它,並在一些徹底的測試後報告回來! – Dudemanword

+0

正如所料,將事件日誌條目轉換爲另一個列表的速度非常慢。我會玩,看看我能做些什麼來加速它。 – Dudemanword

+0

@Dudemanword:不,*鑄造*根本就不慢 - 它是*提取*速度慢的項目。如果您只是*遍歷原始列表並忽略所有內容,則會看到相同的問題。 –