2010-02-18 28 views
1

我有一個自定義日誌框架寫入System.Windows.Forms.TextBox。我現在寫的文本框的方法是這樣的:是否有任何其他方式將文本附加到Textbox控件?

tbLog.Text += newLogEntry.Text; 

這種方法的問題是,每個這種執行從tbLog.Text和newLogEntry.Text字符串時被連接,然後分配給tbLog.Text。隨着TextBox中的日誌增長,操作變得非常耗費內存並越來越慢。

有沒有辦法做到這一點更快,更高效?

+0

你爲什麼要登錄到文本框?應用程序關閉的那一刻你將失去日誌。它是否必須保留完整的歷史記錄,或只是最新的x條目? – Oded 2010-02-18 08:49:46

回答

3

該文本框有一個功能AppendText()。您應該使用它,因爲它比+=運算符更好。

1

'問題'是將一個字符串附加到另一個字符串,每次都在一個新字符串中生成結果。 當你做很多連接時,這可能會非常昂貴。

如果我是你,我不會直接登錄到TextBox。我只會跟蹤日誌消息,並使用文本框來顯示日誌。 通過這樣做,您可以例如選擇將日誌保存到文本文件,或選擇以任何其他方式可視化日誌。

例如,您可以將郵件保留在StringCollectionList<String>中。除了在文本框中對其進行可視化以外,還可以使用ListBox作爲實例,並且每次向日志添加新項目時,都可以向ListBox添加新項目。但是,我會確保這不緊密耦合。 您的日誌類可能會觸發一個事件,例如每次將新消息保存到日誌時。 然後,您可以擁有不同的「觀察員」,通過訂閱事件來跟蹤日誌,並在每次事件發生時採取適當的行動。

1

就我個人而言,我會在使用.Append()的第一個StringBuilder中完成所有工作。然後,我將使用StringBuilder上的.ToString()方法設置textbox文本屬性。

+0

這不是現在發生的事情嗎? – m0sa 2010-02-18 09:19:24

+0

不,你沒有使用stringbuilder。 – 2010-02-18 09:23:09

+0

好的。我誤解了你的答案..我想你的意思是我應該這樣做: var sb = new StringBuilder(tbLog.Text); sb.AppendLine(newLogEntry.Text); tbLog.Text = sb.ToString() 但現在我在記錄器類中使用字符串生成器作爲類變量,並且每當新的條目文件通過時就附加到它。 – m0sa 2010-02-18 09:32:18

相關問題