Gestion correctement l'arrêt de l'arrière-plan sur la fermeture du formulaire
L'utilisation d'un BackgroundWorker
pour mettre à jour l'interface utilisateur d'un formulaire nécessite une manipulation minutieuse de la fermeture du formulaire pour éviter des exceptions telles que ObjectDisposedException
ou des impasses. L'annulation prématurée du BackgroundWorker
pendant la fermeture du formulaire peut provoquer des problèmes de sécurité des filetages, tandis que l'attente de son achèvement peut entraîner des impasses.
La solution optimale consiste à surveiller l'événement FormClosing
et à vérifier l'état de BackgroundWorker
. Si le travailleur est actif, annulez la fermeture, signalez l'intention de fermer et annulez le BackgroundWorker
. Le gestionnaire d'événements BackgroundWorker
S RunWorkerCompleted
vérifie ensuite le signal de fermeture et ferme le formulaire.
Voici une implémentation raffinée:
private bool closingRequested; protected override void OnFormClosing(FormClosingEventArgs e) { if (backgroundWorker1.IsBusy) { closingRequested = true; backgroundWorker1.CancelAsync(); e.Cancel = true; this.Enabled = false; // or this.Hide() for a smoother visual experience return; } base.OnFormClosing(e); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (closingRequested) { this.Close(); } closingRequested = false; // ... other cleanup tasks ... }
Cette méthode annule proprement le BackgroundWorker
, enregistre la demande de fermeture de l'utilisateur et ferme le formulaire une fois le travailleur terminé. Cela garantit une fermeture robuste et fiable, empêchant les exceptions et les impasses.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!