C# 清除画布和内存wpf

C# 清除画布和内存wpf,c#,wpf,canvas,C#,Wpf,Canvas,我有一个画布,我向其中添加了20000个行对象,如下所示 for (var i = 0; i < 20000; i++) { var l = new Line { X1 = 10, Y1 = 10, X2 = 10, Y2 = 100, Stroke = Brushes.White }; canvas.Children.Add(l); } 但这并不能清除内存,就像数据被卡在那

我有一个
画布
,我向其中添加了20000个
对象,如下所示

for (var i = 0; i < 20000; i++)
{
    var l = new Line
    {
        X1 = 10,
        Y1 = 10,
        X2 = 10,
        Y2 = 100,
        Stroke = Brushes.White
    };

    canvas.Children.Add(l);
}
但这并不能清除内存,就像数据被卡在那里一样。因此,当我再添加20000个
对象时,一段时间后内存就会爆炸


我知道,
Line
有开销,我不应该首先使用它,但我的问题现在在另一个领域。如何在不增加内存的情况下清除画布上的20000行并绘制新的行。

你真的确定它们不会消失吗?我刚刚将下面的演示应用程序放在一起

XAML


C#

使用System.Windows;
使用System.Windows.Media;
使用System.Windows.Shapes;
命名空间WpfApplication7
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效btnAdd_单击(对象发送者,路由目标e)
{
对于(变量i=0;i<20000;i++)
{
var l=新行
{
X1=10,
Y1=10,
X2=10,
Y2=100,
笔划=画笔。白色
};
canvas.Children.Add(l);
}
}
私有void btnRemove_单击(对象发送者,路由目标)
{
canvas.Children.Clear();
}
}
}
并使用Ants memory profiler()检查内存使用情况

按下add按钮并添加行后,这是line的实例列表。

您可以清楚地看到其中的行实例,然后在按remove之后,您可以看到行实例已完全消失,并且在顶部的图形中内存使用率正在下降


你真的确定他们不会去吗?我刚刚将下面的演示应用程序放在一起

XAML


C#

使用System.Windows;
使用System.Windows.Media;
使用System.Windows.Shapes;
命名空间WpfApplication7
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效btnAdd_单击(对象发送者,路由目标e)
{
对于(变量i=0;i<20000;i++)
{
var l=新行
{
X1=10,
Y1=10,
X2=10,
Y2=100,
笔划=画笔。白色
};
canvas.Children.Add(l);
}
}
私有void btnRemove_单击(对象发送者,路由目标)
{
canvas.Children.Clear();
}
}
}
并使用Ants memory profiler()检查内存使用情况

按下add按钮并添加行后,这是line的实例列表。

您可以清楚地看到其中的行实例,然后在按remove之后,您可以看到行实例已完全消失,并且在顶部的图形中内存使用率正在下降


内存是否会下降或永远不会下降?您确定在任何地方都没有对这些行的引用吗?不,只有当我手动使用GC.Collect()时,它才会下降。当您说在GC.Collect()之后内存使用量下降时,它也会自动下降。当垃圾收集决定该清理时,就会发生这种情况。你只是等待的时间不够长,或者没有使用足够的其他内存。@Clemens我知道,但它不会下降。我真的被困在这里了,有什么建议吗?那么这不是问题,当GC决定运行时,内存会下降一次,内存会下降吗?您确定在任何地方都没有对这些行的引用吗?不,只有当我手动使用GC.Collect()时,它才会下降。当您说在GC.Collect()之后内存使用量下降时,它也会自动下降。当垃圾收集决定该清理时,就会发生这种情况。你只是等待的时间不够长,或者没有使用足够的其他内存。@Clemens我知道,但它不会下降。我真的被困在这里了,有什么建议吗?那么这不是问题,当GC决定运行时,内存会下降。我在任务管理器中检查私有工作集时,内存没有下降。我找错地方了吗?我在任务管理器中检查私有工作集,它没有下降。我找错地方了吗?
canvas.Children.Clear();
<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Canvas Grid.Row="0" Name="canvas" Background="Black"/>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Button Grid.Column="0" Content="Add" Name="btnAdd" Click="btnAdd_Click" />
            <Button Grid.Column="1" Content="Remove" Name="btnRemove" Click="btnRemove_Click"/>            
        </Grid>
    </Grid>
</Window>
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApplication7
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            for (var i = 0; i < 20000; i++)
            {
                var l = new Line
                {
                    X1 = 10,
                    Y1 = 10,
                    X2 = 10,
                    Y2 = 100,
                    Stroke = Brushes.White
                };

                canvas.Children.Add(l);
            }
        }

        private void btnRemove_Click(object sender, RoutedEventArgs e)
        {
            canvas.Children.Clear();
        }
    }
}