C#事件是否同步?
这个问题有两个部分:
-
提升一个事件是否会阻塞线程,或者是asynchronous启动EventHandlers的执行,并且线程继续同时运行?
-
各个EventHandler (订阅的事件)是否一个接一个地同步运行,还是asynchronous运行,不能保证其他人不能同时运行?
这是一个普遍的答案,并反映了默认行为:
- 是的,如果订阅事件的方法不是asynchronous的,它会阻塞线程。
- 他们一个接着一个被执行。 这有另一个转折:如果一个事件处理程序抛出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调用也是同步的。 在开始完成之前不可能称呼结束。