相关疑难解决方法(0)

在WPF中:Children.Remove或Children.Clear不释放对象

更新:我在另一台安装得更干净的机器上尝试了这个.我无法在那台机器上重现这一点.如果我发现有什么令人讨厌的(VSStudio)组件导致这种情况,我会告诉你.

我从后面的代码创建了一些UIElements,并期待垃圾收集来清理东西.但是,在我预期的时候,对象不会被自由编辑.我期待他们在RemoveAt(0)被释放,但他们只在程序结束时被释放.

从Canvas的Children集合中删除时,如何释放对象?

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
    MouseDown="Window_MouseDown">
  <Grid>
    <Canvas x:Name="main" />
  </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

背后的代码是:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
  }

private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
  GC.Collect(); // This should pick up the control removed at a previous MouseDown
  GC.WaitForPendingFinalizers(); // Doesn't help either

  if (main.Children.Count == 0)
    main.Children.Add(new MyControl() { Background = Brushes.Yellow, Width = 100, Height = 50 });
  else
    main.Children.RemoveAt(0);
 }
}

public class MyControl …
Run Code Online (Sandbox Code Playgroud)

.net wpf garbage-collection memory-management

12
推荐指数
3
解决办法
2万
查看次数

收集仍在范围内的对象 - GC.Collect

我读过这篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx,老实说,我不了解每一个细节.据我所知,在下面的代码中,即使我没有将c设置为null,也应该收集c.另一件事是,只要我们处于相同功能的范围内,在foreach期间发生的分配似乎不会被释放.(见下面的例子)

class Program
{
    public class SomeClass
    {
        public byte[] X;

        public SomeClass()
        {
            X = new byte[1024 * 1024 * 100];
            X[155] = 10;
        }
    }

    static void Main()
    {
        Console.WriteLine("Memory: " + GC.GetTotalMemory(false));

        SomeClass c;
        c = new SomeClass();

        Console.WriteLine("Memory: " + GC.GetTotalMemory(false));
        GC.Collect();
        Console.WriteLine("Memory: " + GC.GetTotalMemory(true));
        Console.ReadKey();

        /*
         * Output:
         * 
         * Memory: 186836
         * Memory: 105044468
         * Memory: 104963676
         * 
         */
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑第一个示例的解决方案:调试模式(不在调试器中运行,但甚至在编译模式下运行).如果我使用Release它将按预期工作:即使没有设置为null也会收集c.对于第二个例子,同样适用.

第二个例子

static void Main(string[] args)
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection

4
推荐指数
1
解决办法
942
查看次数

标签 统计

.net ×2

garbage-collection ×2

c# ×1

memory-management ×1

wpf ×1