这是我的xaml:
<ListBox Grid.Row="4" HorizontalAlignment="Stretch" Margin="10,132,10,10" ScrollViewer.VerticalScrollBarVisibility="Disabled" Name="lbStatus" VerticalAlignment="Stretch" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"/>
和我的C#代码:
public void DisplayStatusMessage(string msg)
{
if (lbStatus.Dispatcher.CheckAccess())
{
AddMessage(msg, Brushes.Black);
}
else
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
AddMessage(msg, Brushes.Black);
}));
}
}
private void AddMessage(string msg)
{
ListBoxItem status = new ListBoxItem();
status.Content = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss:fff ") + msg;
lbStatus.Items.Add(status);
lbStatus.ScrollIntoView(status);
status = null;
}
我在while(true)循环中调用DisplayStatusMessage以显示列表框上的状态。我的应用程序在一夜之间大小增长,这似乎表明列表框中存在内存泄漏。列表框是否有替代显示无限状态?我认为将虚拟化设置为回收可以防止泄漏?
答案 0 :(得分:4)
这本身并不是“泄漏”。如果您不断在ListBox
添加条目,甚至一夜之间,您可能会有数千条条目,这当然需要存储空间。
为避免这种情况,您可以在添加新条目时删除旧条目:
if (listbox.Items.Count > 100)
listbox.Items.RemoveAt(0); // 0 or 99, whichever is your oldest
listbox.Items.Add(status);
listbox.ScrollIntoView(status);