Dans .NET, ce thread va être traitées dans?
J'ai tenté de mettre en œuvre un producteur/consommateur motif en c#. J'ai un thread consommateur qui surveille une file d'attente partagée, et un producteur de fil qui place des éléments sur la file d'attente partagée. Le producteur thread est souscrit pour recevoir des données...qui est, il dispose d'un gestionnaire d'événements, et juste assis autour et attend un OnData cas d'incendie (les données sont envoyées à partir d'un 3ème partie de l'api). Quand il reçoit des données, elle se l'enfonce dans la file d'attente de sorte que le consommateur peut s'en occuper.
Lorsque le OnData événement n'feu dans le producteur, je m'attendais à être manipulé par mon producteur fil. Mais cela ne semble pas être ce qui se passe. Le OnData événement semble comme si elle est traitée sur un nouveau thread à la place! Est-ce de cette manière .net fonctionne toujours...les événements sont gérés sur leur propre thread? Puis-je contrôler ce thread va gérer les événements quand ils sont soulevées? Que faire si des centaines d'événements sont déclenchés quasi-simultanément...chacune son propre thread?
- Il peut être utile de poster du code, et/ou les classes que vous utilisez.
- Parlez-vous des événements dans le C#
event
mot-clé le sens, ou les événements dans leEventWaitHandle
sens? Je pense que vous devriez poster du code... - il sonne comme
event
, compte tenu de son poste.
Vous devez vous connecter pour publier un commentaire.
Après re-lecture de la question, je crois que je comprends le problème maintenant. Vous avez reçu quelque chose comme ceci:
Et puis vous avez un thread consommateur qui tire des trucs que la file d'attente. Le problème est que le OnData événement est déclenché par votre
ExternalSource
objet sur ce thread, il arrive à être en cours d'exécution sur.C#
event
s sont fondamentalement juste un outil facile à utiliser de collecte de délégués et de "cuisson" un événement provoque l'exécution d'une boucle sur l'ensemble des délégués et de feu, un à la fois.De sorte que votre OnData gestionnaire d'événement est appelé sur ce thread la
ExternalSource
est en cours d'exécution sur.À moins que vous ne le marshaling vous-même, un événement va l'exécuter sur n'importe quel thread invoque; il n'y a rien de spécial au sujet de la façon dont les événements sont invoquées, et de producteur de thread n'est pas un gestionnaire d'événement, votre producteur de fil tout simplement dit: "hey, quand vous tirez de cette manifestation, à l'appel de cette fonction". Il n'y a rien là qui provoque l'événement de l'exécution de se produire sur la fixation de fil, ni sur son propre thread (sauf si vous utilisez
BeginInvoke
plutôt que d'invoquer le délégué de l'événement normalement, mais ce sera juste l'exécuter sur l'ThreadPool
).Déclenchant un événement avec
Invoke
est le même que l'appel d'une méthode, il est exécuté dans le même thread que vous avez soulevé, c'.Déclenchant un événement avec
BeginInvoke
utiliseThreadPool
. Voici quelques des détails mineursvous devez utiliser autoresetevent des gestionnaires pour ce problème.....dans autoresetevent lorsque producteur produses il régler le signal puis de consommation réinitialisation du signal et de consommer.. après la consommation de consommer de définir le signal avant de le seul producteur de produits...