2009-08-13 6 views
1

J'ai écrit une application newbie très simple avec un polyèdre à 6 faces (une «boîte») qui pivote de 180 degrés lorsque je clique sur un bouton. puis pivote de nouveau sur le clic suivant. Chaque rotation attrape 90 Mo de plus et ne lâche pas jusqu'à ce que je ferme l'application. La boîte est définie dans le code XAML. Les Storyboard, DoubleAnimation et PropertyPath, etc, sont tous créés une seule fois, dans le constructeur. Le code du bouton ressemble à ceci:Fuite de mémoire dans WPF

private void button_Storyboard1_Click(object sender, RoutedEventArgs e) 
    { 
     GC.Collect(); 

     if (_bFront) 
     { 
      _myDoubleAnimation.From = 0; 
      _myDoubleAnimation.To = 180; 
      _bFront = false; 
     } 
     else 
     { 
      _myDoubleAnimation.From = 180; 
      _myDoubleAnimation.To = 0; 
      _bFront = true; 
     } 
     _myDoubleAnimation.Duration = _Duration; 
     Storyboard.SetTargetName(_myDoubleAnimation, "rotate_me"); 
     Storyboard.SetTargetProperty(_myDoubleAnimation, _PropP); 
     _sb.Children.Add(_myDoubleAnimation); 
     _sb.Begin(this.viewport3D1); 
    } 

Après quelques rotations, je suis à court de mémoire! Que se passe-t-il?

+0

s'il vous plaît pourriez-vous me dire quelle carte gfx c'est s'il vous plaît? –

Répondre

1

Cela peut être totalement faux ici, mais n'ajoutez-vous pas _myDoubleAnimation à _sb.Children à chaque clic, au lieu de simplement le mettre à jour?

+0

J'ai pensé à cela la nuit dernière et j'ai essayé de faire _sb.Children.Clear(); avant l'ajout() sans effet. Je ne vois pas une méthode appelée 'mise à jour' - que voulez-vous dire? (excusez-moi, je suis un novice wpf) La carte gfx est un ATi Radeon X300 qui dit qu'il prend en charge DirectX 9.0 –

+0

ah-HAA! Mais tu avais raison quand même! Quand j'ai déplacé l'Add to the C'Tor (donc je ne l'ai ajouté qu'une seule fois), les changements dans l'animation (To ... and From ...) sont toujours reconnus, mais plus de fuites de mémoire! Merci! Je ne comprends toujours pas pourquoi _sb.Children.Clear() n'a pas aidé. –

+0

Nop, ça sonne bizarre :) Je m'attendrais à ce que _sb.Children.Clear() répare la fuite aussi :) – cwap