c# - 内存泄漏将 imagebrush 加载到 grid.background

标签 c# wpf gridview

我有一个应用程序将屏幕截图发送到另一个需要在 WPF 窗口中显示它们的应用程序 它工作得很好,除了唯一的问题,即每次我添加新背景时代码都会在内存中累积。

我该如何解决这个问题?

谢谢!

  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);
    }

最佳答案

经过数小时的研究和测试,我终于修复了它。 问题出在以下代码中:

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;
}

关于c# - 内存泄漏将 imagebrush 加载到 grid.background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19728626/

相关文章:

c# - Instantiate 方法不会在 Canvas 内绘制预制按钮,也不会使用正确的预制尺寸绘制它

c# - 将值从代码隐藏传递到 Javascript

wpf - MVVM 模式是否被破坏?

android - 如何在 android GridView 教程中应用不同的图标和不同的文本?

android - GridView在android中的可扩展列表中

asp.net - 如何设置GridView的颜色文本

c# - 如何使用 OpenXML C# 在 Excel 中隐藏工作表?

c# - XAML - 为什么数据绑定(bind) TwoWay 不适用于 .net 4.0 中组合框的文本属性?

WPF UserControl 公开自定义属性

c# - 如何在c#中使用DFC获取文档内容