Задайте вопросЗадайте вопрос
 

ОтвеченоMemory is never released. Can't understand even with a profiler.

  • 27 июня 2009 г. 19:43XavierP Медали пользователяМедали пользователяМедали пользователяМедали пользователяМедали пользователя
     
    Hi,

    call the following code several times : Memory is NEVER released. Why ?? Thnaks !
            void SignPicture(string filePath)
            {
                DoIncrust(filePath);

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                File.Delete(filePath);

                File.Move("c:/result.jpg", filePath);
                return;
            }

            private static void DoIncrust(string filePath)
            {

                MemoryStream mem;
                byte[] buffer = File.ReadAllBytes(filePath);
                // by reading the data into an in-memory buffer, we prevent the file from being read in the UI thread
                // -- which speeds up access dramatically!
                mem = new MemoryStream(buffer);

                BitmapImage original = new BitmapImage();
                original.BeginInit();
                original.CacheOption = BitmapCacheOption.None;
                original.StreamSource = mem;
                original.EndInit();

                MemoryStream mem2;
                byte[] buffer2 = File.ReadAllBytes("c:/signature.png");
                mem2 = new MemoryStream(buffer2);

                BitmapImage signature = new BitmapImage();
                signature.BeginInit();
                signature.CacheOption = BitmapCacheOption.None;
                signature.StreamSource = mem2;
                signature.EndInit();

                Image ori = new Image();
                ori.Source = original;
                Image sign = new Image();
                sign.Source = signature;

                Grid signaGrid = new Grid();

                double percent = 0.50;

                double mywidth, myheight;

                ComputeWidthHeight(original, out mywidth, out myheight);

                double ratio = (double)mywidth / (double)myheight;
                double vwidth = percent;
                double vheight = vwidth / ratio;

                double otherwidth = 1.0 - vwidth;
                double otherheight = 1.0 - vheight;

                RowDefinition rd = new RowDefinition();
                rd.Height = new GridLength(otherheight, GridUnitType.Star);
                RowDefinition rd1 = new RowDefinition();
                rd1.Height = new GridLength(vheight, GridUnitType.Star);
                signaGrid.RowDefinitions.Add(rd);
                signaGrid.RowDefinitions.Add(rd1);

                ColumnDefinition cd = new ColumnDefinition();
                cd.Width = new GridLength(otherwidth, GridUnitType.Star);
                ColumnDefinition cd1 = new ColumnDefinition();
                cd1.Width = new GridLength(vwidth, GridUnitType.Star);
                signaGrid.ColumnDefinitions.Add(cd);
                signaGrid.ColumnDefinitions.Add(cd1);

                // Add the image
                Grid.SetRow(ori, 0);
                Grid.SetColumn(ori, 0);
                Grid.SetRowSpan(ori, 2);
                Grid.SetColumnSpan(ori, 2);
                signaGrid.Children.Add(ori);

                // Add the signature image
                Grid.SetRow(sign, 1);
                Grid.SetColumn(sign, 1);
                signaGrid.Children.Add(sign);

                // Render everything
                RenderTargetBitmap bmp = new RenderTargetBitmap(original.PixelWidth, original.PixelHeight,
                    original.DpiX, original.DpiY, PixelFormats.Pbgra32);

                signaGrid.Measure(new Size(original.Width, original.Height));
                signaGrid.Arrange(new Rect(0, 0, original.Width, original.Height));

                bmp.Render(signaGrid);

                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                BitmapFrame bf = BitmapFrame.Create(bmp);

                encoder.Frames.Add(bf);
                FileStream stream;
                stream = new FileStream("c:/result.jpg", FileMode.Create);
                encoder.Save(stream);
                stream.Flush();
                stream.Close();
                stream.Dispose();
                ori.Source = null;
                sign.Source = null;
                signaGrid.RowDefinitions.Clear();
                signaGrid.ColumnDefinitions.Clear();
                bmp.Clear();
                buffer = null;
                buffer2 = null;
                mem.Dispose();
                mem2.Dispose();
                bf = null;
                encoder.Frames.Clear();
            }

            private static void ComputeWidthHeight(BitmapImage original, out double mywidth, out double myheight)
            {
                if (original.PixelWidth > original.PixelHeight)
                {
                    // Paysage
                    mywidth = original.PixelWidth;
                    myheight = original.PixelHeight;
                }
                else
                {
                    // Portrait
                    mywidth = original.PixelHeight;
                    myheight = original.PixelWidth;
                }
            }

Ответы

Все ответы