11
votes

Manipulation des événements croisés dans C #

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;


0 commentaires

3 Réponses :


1
votes

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

  1. 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.

  2. 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. XXX


3 commentaires

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.



4
votes

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.

check Ce fil Pour plus d'informations.


1 commentaires

J'aime cette approche. J'aime utiliser des méthodes de rappel pour signaler lorsqu'un fil est terminé.



2
votes

Vous pouvez ajouter ce code au constructeur checkforillegalcrossthreadcalls = false; et aucune exception ne sera lancée.


0 commentaires