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"))
{
.....
}