我应该如何正确使用CancelEventAgrs/CancelEventHandler?
检查e.Cancel
是否总是返回"正确"的结果,即使事件最终可能消耗一些时间?
Class Foo
Public Event Deleting As System.ComponentModel.CancelEventHandler
Private myObjectsToDelete As List(Of Object)
Function DoDelete() As Boolean
Dim e As New System.ComponentModel.CancelEventArgs
' Suppose a time consumming check '
RaiseEvent Deleting(myObjectsToDelete, e)
If e.Cancel Then
Return False
Else
myObjectsToDelete.Clear()
Return True
End If
End Function
End Class
Class Bar
Private WithEvents myFoo As Foo
Private Sub myFoo_Deleting( _
sender As Object,
e As System.ComponentModel.CancelEventArgs) Handles myFoo.Deleting
Dim objectsList As List(Of Object) = TryCast(sender, List(Of Object))
Dim objectsToDeleteOK As New List(Of Object)
For Each o In objectsList
If CheckIfCanBeDeleted(o) Then
objectsToDeleteOK.Add(o)
End If
Next o
End Sub
Private Function CheckIfCanBeDeleted(o As Object) As Boolean
Dim result As Boolean
' TIME CONSUMMING CHECK '
Return result
End Function
End Class
p。
我放上c#标签,是因为对一般的。net视图感兴趣,而不仅仅是VB。净一个
检查e.c cancel是否总是返回"正确"的结果,即使事件最终可能会消耗一些时间?
您是否担心DoDelete
会在事件处理程序执行完成之前测试e.Cancel
的值?
引发事件是一个阻塞操作,因此DoDelete
的执行将不会继续,直到所有处理程序都被执行。所以,是的,e.Cancel
将始终返回处理程序设置的值,即使处理程序需要一些时间来执行。
如果您将e.Cancel
设置为True
,则是。您的处理程序似乎没有设置它。如果您有多个处理程序处理该事件,那么最后更改e.Cancel
的处理程序获胜。