以下是有关事件处理的几个问题:
问题1
主要是,事件处理程序(UI或非)方法可以执行相对较长的时间吗?
问题2
如果事件处理可能在给定系统中花费大量时间,则可能必须异步执行此处理,以避免阻塞s / w。在这种情况下,发布此事件的类是否应异步调用所有已注册的处理程序?或者这个类可能更好地避免任何这样的假设,并且每个处理程序需要很长时间才能执行,异步执行其大量工作,并立即返回而不会阻塞?
问题3
无论如何,当发布此事件的类使用BeginInvoke异步调用事件处理程序方法时,是否必须调用相应的EndInvoke,甚至考虑异常的可能性?或者提升事件的班级可能会更好地忽略它们?
答案 0 :(得分:0)
回答问题1
见jgauffin。 基本上,事件处理程序必须在相对较短的时间内执行,以便不阻止其余注册处理程序的执行,也不会处理以下事件。毋庸置疑,在处理那些处理UI无响应的事件时,这种需求变得至关重要!
回答问题2
假设发布事件的类不熟悉所有可能的事件处理程序(特别是考虑某些DLL导出类发布的事件),该类必须异步调用所有已注册的处理程序。但这有它的成本(线程切换,缓存,并发,同步,& c:参见,例如,Brannon,Manoj Sharma,甚至this wiki),这不应该除非必须支付。因此,最好的方法是让每个注册的处理程序(当然,它知道自己的工作耗费多少时间)决定它是同步还是异步执行自己的工作。这里有一个好主意:一个事件可以使用它的事件参数结构来发布为每个处理程序分配的时间(这个时间基本上是通过除以当前注册的侦听器允许的总事件处理时间来计算的),让每个处理程序使用此信息决定是同步还是异步执行自己的工作。
回答问题3
请参阅MSDN(注意“重要!”),Hans Passant(杰出的世界级.NET专家),Bruno Brant,最终STW,演示代码;所有这些人似乎都强烈支持调用EndInvoke并捕获可能的异常。 (实际上,一些程序员倾向于避免使用异常,但是C ++,Java和.NET方法固有异常,而Python函数更是如此。如果像Hadoop这样的大数据s / w及其上面的应用程序强烈使用异常,那么任何人都可以。)
<强> 后记 强>
最终,在意识到没有人会回复我的问题之后,我转向微软的社交MSDN,我立刻收到了Magnus(也是一位杰出的世界级.NET专家)的回答,基本同意上述论点;请参阅我们的信函here。