C# WPF内存问题

C# WPF内存问题,c#,wpf,memory,memory-management,memory-leaks,C#,Wpf,Memory,Memory Management,Memory Leaks,我正在尝试加载具有以下代码的图片: void LoadPictures(int s) { grdScene.Children.Clear(); TabControl tab = new TabControl(); for (int i = s; i <= s+3; i++) { System.Drawing.Bitmap bmp = new System.Drawing.Bitmap("C:\\img\\" + i + &

我正在尝试加载具有以下代码的图片:

void LoadPictures(int s)
{
    grdScene.Children.Clear();
    TabControl tab = new TabControl();
    for (int i = s; i <= s+3; i++)
    {
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png");
        TabItem tabItem = new TabItem();
        tabItem.Header = "Scene " + i;
        var bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(),
                                                                    IntPtr.Zero,
                                                                    Int32Rect.Empty,
                                                                    BitmapSizeOptions.FromEmptyOptions());
        Image image = new Image();
        image.Source = bitmapSource;
        tabItem.Content = image;
        tab.Items.Add(tabItem);
    }
    grdScene.Children.Add(tab);//grdScene is Grid
}

我尝试了
GC.Collect()
,但没有任何变化。我应该怎么做才能解决这个问题?

为什么要通过代码隐藏来解决这个问题

从代码的外观来看,选项卡项完全由图像填充

您可以将tabcontrol绑定到图像路径集合,并使用样式来描述所需的外观,这样会简单得多,WPF核心将负责图像加载和内存管理本身


如果这对您不可用,那么您的问题来自于如何加载图像,您是通过一种不安全的互操作方法进行操作的,它不会为您释放内存,您必须自行处置位图
。dispose()

你最好做:

如果希望继续使用代码隐藏而不是互操作方法,那么使用
BitmapImage
可能是更好的方法

因此:

void LoadPictures(int s)
{
grdScene.Children.Clear();
TabControl tab=新TabControl();

对于(inti=s;i为什么要通过代码隐藏来执行此操作

从代码的外观来看,选项卡项完全由图像填充

您可以将tabcontrol绑定到图像路径集合,并使用样式来描述所需的外观,这样会简单得多,WPF核心将负责图像加载和内存管理本身


如果这对您不可用,那么您的问题来自于如何加载图像,您是通过一种不安全的互操作方法进行操作的,它不会为您释放内存,您必须自行处置位图
。dispose()

你最好做:

如果希望继续使用代码隐藏而不是互操作方法,那么使用
BitmapImage
可能是更好的方法

因此:

void LoadPictures(int s)
{
grdScene.Children.Clear();
TabControl tab=新TabControl();
对于(int i=s;i尝试调用所有
IDisposable
s上的Dispose,例如
System.Drawing.Bitmap
,或者更好地使用
使用

using(var bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png"))
{
     .....
}
尝试在所有
IDisposable
s上调用Dispose,例如
System.Drawing.Bitmap
,或者更好地使用
使用

using(var bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png"))
{
     .....
}

我之所以使用位图,是因为我的实际图片不在文件系统中。它存储在数据库中。在我的示例中,为了方便起见,我只是从文件系统加载了它。我正在考虑将二进制图片转换为位图,并将位图转换为位图源。我想我可以直接从字节[]转换到Windows.Controls.Image。我以前不知道。这样就解决了问题。谢谢你的帮助!@Dilshod没问题,是的,你可以通过这种方式转换,但任何时候你都可以使用System。绘图类或WPF互操作系统一定要调用
。Dispose
,它们是邪恶的类,你会得到所有内存泄漏我之所以使用位图,是因为我的实际图片不在文件系统中。它存储在数据库中。在我的示例中,为了方便起见,我只是从文件系统加载了它。我正在考虑将二进制图片转换为位图,并将位图转换为位图源。我想我可以直接从字节[]转换到Windows.Controls.Image。我以前不知道。这样就解决了问题。谢谢你的帮助!@Dilshod没问题,是的,你可以通过这种方式转换,但任何时候你都可以使用System。绘图类或WPF互操作系统一定要调用
。Dispose
,它们是邪恶的类,你会得到所有内存泄漏注意,WPF位图不能作为表单一次性使用:注意,WPF位图不能作为表单一次性使用:
using(var bmp = new System.Drawing.Bitmap("C:\\img\\" + i + ".png"))
{
     .....
}