J'ai un contrôle dérivé de UserControl qui affiche des informations extraites d'un serveur Web. Je suis actuellement en train de rendre l'initialisation du contrôle asyncrone, afin d'améliorer la réactivité.
Dans mon gestionnaire d'événements Load, je crée un CancellationTokenSource et j'utilise le jeton associé dans les différents appels asynchrones.
Je veux maintenant m'assurer que si l'utilisateur ferme le formulaire avant la fin de l'opération asynchrone, l'opération sera annulée. En d'autres termes, je veux appeler Annuler sur le jeton.
J'essaie de comprendre où faire ceci. S'il y avait un événement de déchargement que je pourrais intercepter, ce serait parfait - mais il n'y en a pas. En fait, je ne trouve aucun événement qui semble approprié.
Je pourrais intercepter l'événement de fermeture pour le formulaire conteneur, mais je souhaitais vraiment tout conserver dans mon contrôle utilisateur.
Suggestions?
Je suggère le Control :: HandleDestroyed event. Il est déclenché lorsque le HWnd sous-jacent est détruit (ce qui se produit généralement lorsque le formulaire parent est fermé). Pour le gérer dans votre propre UserControl, vous devez remplacer OnHandleDestroyed .
Vous avez un accès complet aux propriétés du contrôle en ce moment, car il n’est pas encore éliminé.
Une autre solution
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if (parentForm != null)
{
parentForm.Closing -= parentForm_Closing;
}
parentForm = FindForm();
if (parentForm != null)
parentForm.Closing += parentForm_Closing;
}
void parentForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
parentForm.Closing -= parentForm_Closing;
parentForm = null;
//closing code
}
Pourquoi ne pas simplement utiliser l'événement Disposed
?
Lorsqu'un formulaire se ferme, il appelle Dispose
sur lui-même et tous les contrôles enfants sont également supprimés de manière récursive.
Essaye ça:
UserControl.Dispose();