96 votes

les événements C # sont-ils synchrones?

Il y a deux parties à cette question:

  1. La levée d' un événement bloque-t-elle le thread ou démarre-t-elle l'exécution asynchrone des gestionnaires d'événements et le thread continue-t-il en même temps?

  2. Les gestionnaires d'événements individuels (abonnés à l'événement) sont-ils exécutés de manière synchrone les uns après les autres, ou sont-ils exécutés de manière asynchrone sans aucune garantie que d'autres ne s'exécutent pas en même temps?

70voto

Daniel Hilgarth Points 90722

C'est une réponse d'ordre général et reflète le comportement par défaut:

  1. Oui, il bloque le thread, si les méthodes de vous abonner à l'événement ne sont pas asynchrone.
  2. Ils sont exécutés l'un après l'autre. Cela a un autre truc en plus: Si un gestionnaire d'événement déclenche une exception, les gestionnaires d'événements non encore exécuté ne sera pas exécuté.

Cela dit, chaque classe qui fournit des événements peuvent choisir de mettre en œuvre son événement de manière asynchrone. IDesign fournit une classe appelée EventsHelper qui simplifie le travail.

[Note] ce lien vous oblige à fournir une adresse e-mail pour télécharger EventsHelper classe.

14voto

Vladimir Points 1644

Les délégués abonnés à l'événement sont appelés de manière synchrone dans l'ordre dans lequel ils ont été ajoutés. Si l'un des délégués lève une exception, les suivants ne seront pas appelés.

Les événements étant définis avec des délégués de multidiffusion, vous pouvez écrire votre propre mécanisme de déclenchement à l'aide de

 Delegate.GetInvocationList();
 

et invoquer les délégués de manière asynchrone;

12voto

loki2302 Points 4101

Les événements ne sont que des tableaux de délégués. Tant que l'appel du délégué est synchrone, les événements sont également synchrones.

7voto

Jamiec Points 35773

En général, les événements sont synchrones. Cependant , il y a quelques exceptions, comme System.Timers.Timer.Elapsed événement étant permis de soulever une ThreadPool fil si SyncronisingObject est nulle.

Docs: http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspx

3voto

Doc Brown Points 13438

Les événements en C # s'exécutent de manière synchrone (dans les deux cas), tant que vous ne démarrez pas un deuxième thread manuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X