2011-07-15 6 views
4

essaie de rendre une image avec RenderTargetBitmap chaque fois que je crée une instance de RenderTargetBitmap pour rendre l'image la mémoire accrue et quand je suis fait la mémoire n'a jamais publié ce qui est le code:RenderTargetBitmap fuite de mémoire

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
               (int)(renderHeight * dpiY/96.0), 
               dpiX, 
               dpiY, 
               PixelFormats.Pbgra32); 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext ctx = dv.RenderOpen()) 
    { 
     VisualBrush vb = new VisualBrush(target); 
     ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
    } 
    rtb.Render(dv); 

s'il vous plaît j'ai besoin d'aide comment puis-je libérer la mémoire et merci pour tous.

Répondre

0

Ce n'est pas une véritable fuite de mémoire, au moins dans mon expérience. Vous verrez l'utilisation de la mémoire grimper dans le gestionnaire de tâches, mais le garbage collector devrait s'en occuper quand il le faut (ou vous pouvez appeler GC.Collect() pour voir ce qui se passe). Cela dit, si vous dessinez des formes, DrawingContext/DrawingVisuals ne sont pas idéales dans WPF. Vous seriez beaucoup mieux d'utiliser des graphiques vectoriels et vous auriez un certain nombre d'avantages secondaires, y compris l'évolutivité et ne pas voir ce problème d'utilisation de la mémoire.

Voir ma réponse à une question similaire ici: Program takes too much memory

+1

merci, mais cela est faux j'ai essayé GC.Collect(), et attendu pour libérer de la mémoire, mais il n'a jamais publié –

+0

Muhammad, est-il possible que vous le faites sur un thread non-interface utilisateur? Si oui, cela peut être pertinent: https://connect.microsoft.com/VisualStudio/feedback/details/648683/memory-leak-in-wpf-of-dispatcher-and-mediacontext-objects-resulting-in-win32exceptions – JacobJ

3

si vous surveillez les comportements de la classe RenderTargetBitmap en utilisant le moniteur de ressources , vous pouvez voir chaque fois que cette classe appelée, vous perdez 500Ko de mémoire. Ma réponse à votre question est: N'utilisez pas la classe RenderTargetBitmap tant de fois

Vous ne pouvez pas libérer d'événement la mémoire utilisée de RenderTargetBitmap.

Si vous avez vraiment besoin d'utiliser la classe RenderTargetBitmap, ajoutez simplement ces lignes à la fin de votre code.

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

cela peut résoudre votre problème:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
                (int)(renderHeight * dpiY/96.0), 
                dpiX, 
                dpiY, 
                PixelFormats.Pbgra32); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext ctx = dv.RenderOpen()) 
     { 
      VisualBrush vb = new VisualBrush(target); 
      ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
     } 
     rtb.Render(dv); 

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