3
我有一個應用程序發送截圖到另一個需要在WPF窗口中呈現它們的應用程序 它工作的很好,除了唯一的問題是代碼每次在內存中建立我添加了一個新的背景。內存泄漏加載imagebrush到grid.background
我該如何解決這個問題?
謝謝!
private void GetSnapshots(object state)
{
using (var socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Connect(new IPEndPoint(IPAddress.Parse("10.0.0.9"), 8081));
while (Connected)
{
var lengthData = new byte[4];
var lengthBytesRead = 0;
while (lengthBytesRead < lengthData.Length)
{
var read = socket.Receive(lengthData, lengthBytesRead, lengthData.Length - lengthBytesRead, SocketFlags.None);
if (read == 0) return;
lengthBytesRead += read;
}
var length = BitConverter.ToInt32(lengthData, 0);
var imageData = new byte[length];
var imageBytesRead = 0;
while (imageBytesRead < imageData.Length)
{
var read = socket.Receive(imageData, imageBytesRead, imageData.Length - imageBytesRead, SocketFlags.None);
if (read == 0) return;
imageBytesRead += read;
}
using (var stream = new MemoryStream(imageData))
{
var bitmap = new Bitmap(stream);
Dispatcher.Invoke(new ImageCompleteDelegate(ImageComplete), new object[] { bitmap });
stream.Dispose();
bitmap.Dispose();
}
}
socket.Disconnect(false);
}
}
public static System.Windows.Media.Brush CreateBrushFromBitmap(Bitmap bmp)
{
return new ImageBrush(Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()));
}
private delegate void ImageCompleteDelegate(Bitmap bitmap);
private void ImageComplete(Bitmap bitmap)
{
if (_buffer != null)
{
_buffer = null;
}
_buffer = new Bitmap(bitmap);
bitmap.Dispose();
//ScreenShotG is a Grid Element inside the XAML
ScreenShotG.Background = CreateBrushFromBitmap(_buffer);
}
爲什麼你認爲這是一個問題呢? ) – Dennis
你爲什麼要調用'stream.Dispose()'?一旦執行離開'使用'模塊,它就會被處理掉。 – gleng
我會刪除displose命令,謝謝你的提示。 我仍然有建立內存的問題,並導致應用程序崩潰。 this row:ScreenShotG.Background = CreateBrushFromBitmap(_buffer);導致應用程序在內存建立30秒後崩潰 –