【发布时间】:2014-10-25 18:35:33
【问题描述】:
我不明白这里泄漏了什么
using GDI = System.Drawing;
public partial class MainWindow : Window
{
[DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr obj);
public MainWindow()
{
InitializeComponent();
var timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(50) };
timer.Tick += (s, a) =>
{
using (var bitmap = new GDI.Bitmap(1000, 1000))
{
var hbitmap = bitmap.GetHbitmap();
var image = Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
image.Freeze();
DeleteObject(hbitmap);
}
};
timer.Start();
}
bitmap?弃置。 hbitmap?已删除。 image?冻结,它不是IDisposable。
事实上,这个应用程序会崩溃(在我的电脑上运行大约 20 秒后)
System.Drawing.dll 中出现“System.OutOfMemoryException”类型的未处理异常
附加信息:内存不足。
有什么想法吗?
【问题讨论】:
-
这是一个非常快的循环,您是否在尝试删除之前没有得到
hbitmap? -
@Sayse,你有什么建议?要检查
null还是什么? -
使用内存分析器?
-
/\ Profiler 听起来不错,为了测试(仅!)可能值得添加
Thread.Sleep -
@SriramSakthivel,我认为给出的例子足以让更有经验的人告诉我哪里出了问题。在这种情况下,我对内存分析器可以告诉我的内容有特快版和非常有限的知识......
标签: c# wpf memory-leaks