C#事件是否同步?

这个问题有两个部分:

  1. 提升一个事件是否会阻塞线程,或者是asynchronous启动EventHandlers的执行,并且线程继续同时运行?

  2. 各个EventHandler (订阅的事件)是否一个接一个地同步运行,还是asynchronous运行,不能保证其他人不能同时运行?

这是一个普遍的答案,并反映了默认行为:

  1. 是的,如果订阅事件的方法不是asynchronous的,它会阻塞线程。
  2. 他们一个接着一个被执行。 这有另一个转折:如果一个事件处理程序抛出exception,则尚未执行的事件处理程序将不会执行。

话虽如此,每个提供事件的类都可以selectasynchronous实现其事件。 EventsHelper提供了一个名为EventsHelper的类来简化这个过程。

[注]这个链接要求你提供一个电子邮件地址来下载EventsHelper类。

订阅该事件的委托按照它们添加的顺序同步调用。 如果其中一个代表抛出exception, 则不会调用下面的exception。

由于事件是由多播委托来定义的,你可以使用自己的发射机制

 Delegate.GetInvocationList(); 

并asynchronous调用代理;

事件只是代表的数组。 只要委托调用是同步的,事件也是同步的。

一般来说,事件是同步的。 但是,如果SyncronisingObject为null,则会出现一些exception,如在ThreadPool线程上引发System.Timers.Timer.Elapsed事件。

文档: http : //msdn.microsoft.com/zh-CN/library/system.timers.timer.elapsed.aspx

C#中的事件同步运行(在这两种情况下),只要你不手动启动第二个线程。

事件是同步的。 这就是事件生命周期如此工作的原因。 Inits在加载之前发生,加载在渲染之前发生

如果没有处理程序被指定为一个事件,循环只是通过。 如果指定了多个处理程序,那么将按顺序调用它们,直到另一个完成后才能继续。

即使asynchronous调用也是同步的。 在开始完成之前不可能称呼结束。