Que se passera-t-il lorsque 10 threads s'abonneront au même événement et aux incendies de l'événement? Quel fil le ramassera? p>
6 Réponses :
Le fil ne vous abonnez pas aux événements, les objets font. strong> Lorsqu'un événement déclenche, tous les gestionnaires enregistrés exécutent sur le même thread (celui qui a soulevé l'événement). Il n'y a pas d'installation intégrée pour les événements pour tirer sur plusieurs threads. P>
Un gestionnaire peut choisir d'envoyer les informations d'événement à un fil séparé, si vous le souhaitez, mais cela ne fait pas partie du mécanisme intégré de l'expédition des événements. P>
Si vous souhaitez une vision plus asynchrone des événements, vous pouvez consulter RX A >. Utilisation de Rx, il est assez facile d'avoir des événements marshal à un thread particulier (en supposant qu'il a un synchronisationContext code> au maréchal à, bien sûr).
Les threads ne sont pas des objets. Un threads est quelque chose que la CPU et le système d'exploitation vous donne, c'est un chemin d'exécution, un contexte d'exécution. Vous avez des objets qui vous donnent accès aux détails liés à ces threads, mais que les "threads sont des objets" est faux.
:), ehehe je reçois ce que tu veux dire mais en Java, vous pouvez créer un objet de thread ... :) NVM, ... :)
@ultrajohn vous pouvez aussi faire cela en C #, mais cela n'a rien à voir avec quoi que ce soit en ce qui concerne les événements.
Je pense que ce que vous voulez dire ici, c'est que plusieurs objets sur des threads distincts s'abonnent à un événement. P>
Tous les gestionnaires seront appelés mais sur le même fil qui a invoqué l'événement. P>
La réponse à votre question Je suppose que cela dépend de la mise en œuvre du répartiteur de l'événement ... Habituellement, vous utilisez une liste pour garder une trace de tous les gestionnaires d'événements qui sont souscrits à un événement particulier, le plus probablement en termes de ceci. Type de mise en œuvre, le premier gestionnaire qui est tiré est le premier gestionnaire d'événements qui s'est abonné si vous appelez bien sûr toutes les procédures pertinentes de manière synchrone, sinon cela dépend ... Juste une pensée .. P>
Si vous voulez savoir quel objet prendra l'événement, chaque objet qui souscrit à un événement prendra en charge cet événement, mais chacun sera exécuté sur le fil sur lequel l'événement s'est produit. p>
Si vous voulez savoir quel objet ramassera cet événement d'abord voir la réponse aux ultrajohnons. P>
Je pense que si je comprends votre question. Vous voulez demander à votre objet expose un événement que l'utilisateur de votre objet peut souscrire. Si 10 utilisateurs différents de votre objet se sont souscrits à cet événement et que, à un moment donné, vous tirez l'événement, quel serait l'ordre (ou simultanément) les gestionnaires d'événements seraient invoqués? P>
Si par "événement", vous voulez dire un événement de synchronisation Win32 (ce qui est de savoir comment je lis la question), cela dépend de la création de la création de l'événement. Si sa réinitialisation manuelle, l'événement signalera toutes les threads et tous s'exécuteront. Si sa réinitialisation automatique, un seul thread sera signalé et exécuté. L'un de vos 10 threads en attente de l'événement pourrait être choisi. P>
Qu'est-ce que tu veux dire des fils? Comment le thread peut-il s'abonner à l'événement? Je pense que tu voulais dire quelque chose de différent ...
10 threads exécutant la même méthode qui souscrit à un événement.
Cette question est un peu déroutante ou peut ne pas être comprise correctement. Si l'événement est un événement Windows (c'est-à-dire créé par CreateEeEvent) et plusieurs threads attendent qu'il soit signalé, la réponse de Scotttx semble être correcte. Si l'événement est l'événement de l'application de candidature (semblable à Delphi ou C # onclick événement d'un bouton), de nombreuses réponses peuvent être correctes! (Mais encore une fois, comment plusieurs threads peuvent abonner à un événement d'application? !!). Ce message est censé donner aux lecteurs une tête, même si c'est une question ancienne.