/ / Méthode la plus simple pour éviter les fuites de mémoire dans un scénario à 2 fenêtres - wpf, événements, fuites de mémoire

Méthode la plus simple pour éviter les fuites de mémoire dans un scénario à 2 fenêtres - wpf, événements, fuites de mémoire

J'ai deux fenêtres: a maîtriser fenêtre, et un détails fenêtre qui s'ouvre en double-cliquant sur unligne spécifique dans la grille de données de la fenêtre principale. Je souhaite actualiser le contrôle de la grille de données de la fenêtre principale lorsque les données de la fenêtre de détails sont enregistrées.

(Quelques détails non pertinents: chaque fenêtre hérite d'un BaseWindow et possède sa propre copie d'une classe héritant d'EF5 DbContext. J'ai ajouté un Save événement à la classe partielle et remplacé SaveChanges pour soulever cet événement chaque fois SaveChanges est appelé. C'est en fait l'événement auquel j'attache un gestionnaire d'événements.)

Je sais que je peux le faire en attachant un gestionnaire d'événements au Save un événement. Cependant, je n'ai aucune idée de l'ordre dans lequel les fenêtres seront fermées - si la fenêtre principale est fermée en premier, il y aura toujours une référence à elle conservée par l'instance de la fenêtre de détails.

Si j'écoute le Closing"/"Closed événement de la fenêtre principale afin que je puisse dire quandrelâchez le gestionnaire attaché à l'événement "Save", j'aurai le même problème à l'envers - la fenêtre principale contiendra une référence à la fenêtre de détails même après la fermeture de la fenêtre de détails.

Je sais que je peux mettre en œuvre un WeakEventManager comme décrit ici, mais j'aimerais savoir s'il existe une technique plus simple que je peux utiliser. (On m'a dit que j'avais tendance à trop compliquer les choses.)

(Je n'utilise pas MVVM.)

Réponses:

0 pour la réponse № 1

WeakEventManager ferait le travail, il suffit d'utiliser la version générique et il n'y a rien de compliqué à ce sujet. En termes de performances, cela devrait être parfaitement bien dans votre cas.

Une autre option serait de désinscrire le gestionnaire d'événements sur Closing de la fenêtre principale de la fenêtre principale, comme vous l'avez dit.

Pour supprimer toutes les références lorsque la fenêtre de détails est fermée, désabonnez tous les gestionnaires d'événements de la fenêtre de détails lorsque la fenêtre de détails se ferme, en abonnant cette méthode à la Closing un événement:

public OnClosing()
{
Delegate[] registeredDelegates = saveHandler.GetInvocationList();
foreach (Delegate d in registeredDelegates )
saveHandler-= (d as SaveDelegate);
}

où saveHandler est votre gestionnaire et SaveDelegate est votre type de délégué personnalisé.

Cela étant dit, si vous voulez vous débarrasser de votre image de surcomplication, ne vous en souciez pas ...