WPF列表框内存泄漏

时间:2016-10-19 18:51:06

标签: c# wpf xaml memory-leaks listbox

这是我的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以显示列表框上的状态。我的应用程序在一夜之间大小增长,这似乎表明列表框中存在内存泄漏。列表框是否有替代显示无限状态?我认为将虚拟化设置为回收可以防止泄漏?

1 个答案:

答案 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);