Mengatasi Kebocoran Memori dalam WPF Apabila Menggunakan CreateBitmapSourceFromHBitmap()
Aplikasi WPF kerap memaparkan imej yang dijana piksel demi piksel. Pendekatan biasa melibatkan penggunaan System.Drawing.Bitmap
dan menukarnya kepada BitmapSource
melalui CreateBitmapSourceFromHBitmap()
. Walau bagaimanapun, kaedah ini boleh menyebabkan kebocoran memori jika tidak dikendalikan dengan teliti.
Punca Masalah
Isu teras berpunca daripada GetHbitmap()
. Fungsi ini mengembalikan objek bitmap GDI, yang memorinya diuruskan oleh sistem pengendalian Windows. Yang penting, ingatan ini memerlukan keluaran eksplisit menggunakan DeleteObject()
. Kegagalan berbuat demikian mengakibatkan pengumpulan memori dengan setiap panggilan ke CreateBitmapSourceFromHBitmap()
.
Penyelesaian: Pengurusan Sumber yang Betul
Untuk mengelakkan kebocoran memori, adalah penting untuk melupuskan objek bitmap GDI dengan betul selepas mencipta BitmapSource
. Kod berikut menunjukkan pendekatan yang betul:
// Import the DeleteObject() method [DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); // Code to create and dispose of the Bitmap using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000)) { IntPtr hBitmap = bmp.GetHbitmap(); try { var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); // Use the 'source' BitmapSource here... } finally { DeleteObject(hBitmap); } }
Menggunakan using
Kenyataan untuk Keselamatan yang Dipertingkatkan
Pernyataan using
menyediakan cara yang lebih bersih dan selamat untuk mengurus sumber, memastikan pelupusan automatik walaupun berlaku pengecualian.
Dengan menggunakan teknik ini, anda secara berkesan menghapuskan kebocoran memori yang dikaitkan dengan CreateBitmapSourceFromHBitmap()
, mengekalkan pengurusan memori yang optimum dalam aplikasi WPF anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Kebocoran Memori Apabila Menggunakan CreateBitmapSourceFromHBitmap() dalam WPF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!