WPF:如何在循环中多次克隆图像?

时间:2015-11-14 19:25:07

标签: c# .net wpf .net-4.5

目标:多次克隆图像。

问题:它有一个例外:

  

类型' System.OutOfMemoryException'的例外情况发生在   PresentationCore.dll但未在用户代码中处理   信息:内存不足,无法继续执行   程序

问题:如何以正确的方式做到这一点?

代码:

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

        double width = 1000;

        Ellipse ellipse = new Ellipse();
        ellipse.Width = width;
        ellipse.Height = width;
        ellipse.Fill = Brushes.Red;
        ellipse.Arrange(new Rect(0, 0, width, width));

        RenderTargetBitmap rtb = new RenderTargetBitmap((int)width, (int)width, 96, 96, PixelFormats.Pbgra32);
        rtb.Render(ellipse);

        for (int i = 0; i < 1000; i++)
            rtb.Clone(); // Exception
    }
}

1 个答案:

答案 0 :(得分:1)

为了获得最佳效果,您应该提出与实际问题相关的问题。简直不可信的是,人们需要在这样的紧密循环中克隆位图1000次。

尽管如此,答案很简单:你的垃圾收集器速度太快,无法跟上垃圾收集器。在达到堆的最大大小之前,它没有丢弃先前分配的内存。

您至少有两种方法可以解决问题。一种是更改循环,以便定期强制进行垃圾收集(例如,每次克隆位图时):

    for (int i = 0; i < 1000; i++)
    {
        rtb.Clone(); // Exception
        GC.Collect();
    }

或者,您可以将项目作为64位进程运行,在这种情况下,它有足够的地址空间用于4GB的分配。