用ILDASM研究事件
如果你使用ILDASM(包含在.NET Framework SDK中的.NET Framework IL反汇编工具)来打开这个示例的可执行版本,你将获得如你在图 1中所看到的信息。尽管FileSearch1并没有显式地包含一个命名为FileFoundEventHandler的多路广播委托,Visual Basic .NET编译器已创建了一个(多路广播委托),对应于代码声明的由FileFound事件定义的类型。编译器也创建了一个表示事件侦听器的委托类型FileFoundEventHandler的名为FileFoundEvent的实例。
图 1 在ILDASM中的示例代码 |
使用这个技术,编译器可以强迫严格遵循你的事件声明的参数签名,而不用你再去为创建你自己的委托类型和在你的事件声明中预定的类型而操心。正如你后面将看到的一样,你可以完全随意地创建你自己的委托表示你的事件并且可用这个委托作为你的事件的类型。
多事件处理程序
我将讨论的下一个类:FileSearch2,它是FileSearch1类的一个相似的拷贝。使用FileSearch2中的唯一的不同是:示例窗体对于FileSearch2类的 FileFound事件包括多个侦听器。这就是,frmMain.vb包括以下的声明:
’’以下代码来自FileSearch1.vb Private WithEvents fs2 As FileSearch2 |
这个示例窗体也包括了在图 2 中所示的事件处理程序。这些事件处理程序也监听由FileSearch3和FileSearch4类引发的FileFound事件,这个我下面还有讲到。
’ From frmMain.vb Private Sub EventHandler2( _ ByVal NewFile As System.IO.FileInfo) _ Handles fs2.FileFound, fs3.FileFound, fs4.FileFound AddText("EventHandler2: " & NewFile.FullName) End Sub
Private Sub EventHandler3( _ ByVal NewFile As System.IO.FileInfo) _ Handles fs2.FileFound, fs3.FileFound, fs4.FileFound
AddText("EventHandler3: " & NewFile.FullName) End Sub |
点击在主窗体上的Multi-Listener按钮会创建一个FileSearch2类的实例,调用这个实例的执行(execute)方法,就会显示如图 3中所示的输出。
图 3 多侦听器(Multiple Listeners)允许多过程(Multiple Procedures)运行 |
但是注意,当你使用多个Handles子句对同一事件反应时,你完全不能控制事件处理程序运行的顺序。.NET Framework提供两个选择,这将稍后在文章中讨论,它允许你获得对多侦听器的更强地控制。 异常和多个事件处理程序(Multiple Event Handlers) 正如你已经看到的,一切都让人称心如意。如果你有一个事件的多个处理程序,当事件引发时,.NET Framework将依次调用每个处理程序。到目前为止一切顺利。如果其中某个事件处理程序产生一个异常时将会发生什么?事情就没有那么顺利了。
为证实这个问题,点击在示例窗体上的RaiseEvent Error按钮。这个例子创建了FileSearch3类的一个新的实例(在这个类本身没有什么新东西)。在图 4 中的示例窗体中提供了若干过程,它处理了FileSearch3.FileFound事件,但是有个过程抛出了一个异常。
图 5 某个事件侦听器抛出一个错误
Figure 4 One Event Handler Raises an Error ’ From frmMain.vb Private Sub EventHandler2( _ ByVal NewFile As System.IO.FileInfo) _ Handles fs2.FileFound, fs3.FileFound, fs4.FileFound
AddText("EventHandler2: " & NewFile.FullName) End Sub
Private Sub EventHandler3( _ ByVal NewFile As System.IO.FileInfo) _ Handles fs2.FileFound, fs3.FileFound, fs4.FileFound
AddText("EventHandler3: " & NewFile.FullName) End Sub
Private Sub EventHandler4( _ ByVal NewFile As System.IO.FileInfo) _ Handles fs3.FileFound, fs4.FileFound
AddText("EventHandler4: Throwing exception!") Throw New ArgumentException End Sub
|
在你运行这个代码时会发生什么?你将获得图 5所示的结果。若有任何一个事件侦听器引发一个异常,整个“事件处理链(event-handling chain)”就停下来。如果你停下来考虑这是怎么回事,你会知道这个行为是有意义的。
 
2/2 首页 上一页 1 2 |