目标:多次克隆图像。
问题:它有一个例外:
类型' 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
}
}
答案 0 :(得分:1)
为了获得最佳效果,您应该提出与实际问题相关的问题。简直不可信的是,人们需要在这样的紧密循环中克隆位图1000次。
尽管如此,答案很简单:你的垃圾收集器速度太快,无法跟上垃圾收集器。在达到堆的最大大小之前,它没有丢弃先前分配的内存。
您至少有两种方法可以解决问题。一种是更改循环,以便定期强制进行垃圾收集(例如,每次克隆位图时):
for (int i = 0; i < 1000; i++)
{
rtb.Clone(); // Exception
GC.Collect();
}
或者,您可以将项目作为64位进程运行,在这种情况下,它有足够的地址空间用于4GB的分配。