2013-11-01 78 views
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); 
    } 
+0

爲什麼你認爲這是一個問題呢? ) – Dennis

+1

你爲什麼要調用'stream.Dispose()'?一旦執行離開'使用'模塊,它就會被處理掉。 – gleng

+0

我會刪除displose命令,謝謝你的提示。 我仍然有建立內存的問題,並導致應用程序崩潰。 this row:ScreenShotG.Background = CreateBrushFromBitmap(_buffer);導致應用程序在內存建立30秒後崩潰 –

回答

1

經過許多小時的研究和測試,我終於修好了它。 問題是在下面的代碼:

public static System.Windows.Media.Brush CreateBrushFromBitmap(Bitmap bmp) 
{ 
    return new ImageBrush(Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())); 
} 

的解決方案是:

public static System.Windows.Media.Brush CreateBrushFromBitmap(Bitmap bmp) 
{ 
    IntPtr hBitMap = bmp.GetHbitmap(); 
    ImageBrush b = new ImageBrush(Imaging.CreateBitmapSourceFromHBitmap(hBitMap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())); 
    DeleteObject(hBitMap); 
    return b; 
}