Kebocoran Memori dalam WPF BitmapSource Creation daripada HBitmap
Mencipta imej piksel demi piksel dalam WPF menggunakan CreateBitmapSourceFromHBitmap() boleh menyebabkan kebocoran memori jika tidak ditangani dengan baik. Apabila kaedah ini berulang kali dipanggil tanpa membebaskan memori BitmapSource, penggunaan memori terus meningkat.
Punca Asas
Isu ini berpunca daripada fakta bahawa Bitmap.GetHbitmap( ) mendapatkan semula pemegang ke objek bitmap GDI. MSDN secara jelas menyatakan bahawa pemegang ini mesti dibebaskan menggunakan kaedah DeleteObject GDI untuk melepaskan sumber memori yang berkaitan.
Penyelesaian
Untuk membetulkan kebocoran memori, adalah penting untuk melepaskan pemegang yang diperoleh daripada Bitmap.GetHbitmap(). Pengubahsuaian berikut hendaklah dibuat:
Contoh Kod
Kod berikut menunjukkan cara menggunakan pendekatan ini:
// Import DeleteObject from gdi32.dll [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); // Your Code using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000)) { // Obtain HBitmap handle IntPtr hBitmap = bmp.GetHbitmap(); try { // Create BitmapSource using HBitmap (using statement handles GDI bitmap disposal) var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); } finally { // Release HBitmap handle DeleteObject(hBitmap); } }
Dengan melaksanakan perubahan ini, anda boleh mencegah kebocoran memori dengan berkesan dan melepaskan sumber yang dikaitkan dengan BitmapSource dengan berkesan dicipta daripada HBitmap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Kebocoran Memori Apabila Mencipta WPF BitmapSource daripada HBitmap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!