Je travaille avec un cadre qui exécute son propre répartiteur d'événements dans un fil séparé. Le cadre peut générer des événements.
var form = new SomeForm(); var src = new SomeDataSource(); // ... src.OnFrameworkEvent += form.SomeAction; form.Closing += (sender, eargs) => src.OnFrameworkEvent -= form.SomeAction;
3 Réponses :
Je n'ai pas utilisé de cadre avec son propre répartiteur d'événement, mais j'avais ma propre expérience avec les threads que j'ai créés. Voici mon expérience
Cette approche n'est pas du thread-coffre-fort. L'invocation sera toujours appelée même si le programme lui-même est fermé. J'ai vu cela dans le gestionnaire de tâches (après la fermeture du programme comme vous le dites) en tant que threads suspendus. (Même si vous tuez le programme de Task Manager également.). Je devais tuer ces discussions séparément plus tard. p> li>
Lorsque le formulaire ferme, vous devez tuer le thread du répartiteur de sorte qu'il ne se bloque pas si quelque chose de mal arrive dans ce fil. p>
Et si le fil du répartiteur doit rester en vie pour gérer d'autres vainqueurs?
Je crains que ce soit le cas. J'ai plusieurs formulaires écoutant la même source d'événement.
Si je comprends correctement ce que vous dites, la définition de la propriété Isbackground du thread sur TRUE empêchera de suspendre les threads.
Non, ce n'est pas le cas. Le thread peut simplement exécuter le gestionnaire d'événements pendant que vous l'enregistrez et fermez le formulaire. Petites chances, mais pas zéro. Vous devez avoir le fil arrêté avant de pouvoir fermer le formulaire. Si vous ne voulez pas l'abandonner, vous devrez garder le formulaire ouvert en annulant l'événement FORMAGNELLOS, puis laissez le rappel de l'achèvement du fil fermer le formulaire. P>
check Ce fil Pour plus d'informations. p>
J'aime cette approche. J'aime utiliser des méthodes de rappel pour signaler lorsqu'un fil est terminé.
Vous pouvez ajouter ce code au constructeur checkforillegalcrossthreadcalls = false; code> et aucune exception ne sera lancée. P>