我想用下面的代碼加載圖片:WPF內存問題
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
}
它工作正常,但我每次運行這個方法內存正在上升。 然後我嘗試將所有項目設置爲null
,但沒有成功。這裏是代碼:
foreach (var child in grdScene.Children)
{
TabControl tab1 = (TabControl)child;
foreach (TabItem item in tab1.Items)
{
Image img = (Image)item.Content;
img = null;
}
tab1 = null;
}
我試過GC.Collect()
沒有什麼變化。我該怎麼做才能解決這個問題? 任何幫助表示讚賞。
我用位圖的原因是我的實際照片不會在文件系統中。它存儲在數據庫中。在我的例子中,爲了使它更容易,我只是從文件系統中加載它。我正在考慮將二進制圖片轉換爲位圖並將位圖轉換爲BitmapSource。我想我可以直接從字節[]轉換爲Windows.Controls.Image。我以前不知道。這樣可以解決問題。感謝您的幫助! – Dilshod 2013-04-04 21:55:02
@Dilshod @Dilshod沒問題,是的,你可以通過這種方式進行轉換,但是無論何時你使用System.Drawing類或WPF互操作系統,一定要調用'.Dispose',它們是邪惡的類,你會得到內存泄漏到處都是。 – Clint 2013-04-04 21:56:48