Самая большая проблема заключается в следующей строке:
StatusMessage = String.Join("\n", msgList);
Это означает, что вы перестраиваете всю строку каждый раз, когда обновляется основной список строк, и она проходит по всему списку, выделяя новые буферы памяти добуфер достаточно большой, чтобы заполнить всю строку (все 500 строк).Когда ваш список сообщений увеличивается до 500 строк, это означает, что следующее сообщение приведет к выделению 500 буферов просто для восстановления полной строки.
Лучшим способом было бы сохранить StringBuilder
рядом с вашим списком сообщений (вваша msgList
переменная).StringBuilder
умен в том, как он распределяет буферы при изменении ваших сообщений.
Я написал следующий фрагмент, и на моей машине требуется время, чтобы добавить новое сообщение в список, в котором уже содержится 500 сообщений.оно меньше миллисекунды.
// Somewhere in your code, probably next to your [msgList] variable...
private StringBuilder sb = new StringBuilder();
private void OutputMessage(string msg)
{
if (!string.IsNullOrEmpty(msg))
{
string msgWithTimeStamp = System.DateTime.Now.ToString() + ": \t" + msg;
msgList.Add(msgWithTimeStamp);
sb.AppendLine(msgWithTimeStamp);
if (msgList.Count > 500)
{
sb.Remove(0, msgList[0].Length + 2); // The +2 is to account for the new line and carriage return characters.
msgList.RemoveAt(0);
}
statusMessage = sb.ToString();
}
}
Единственным недостатком этого подхода является поддержание одного и того же набора сообщений дважды.