ser*_*hio 1 .net c# vb.net event-handling
我应该如何正确使用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
Run Code Online (Sandbox Code Playgroud)
附言。
我放置 C# 标签,因为对通用 .NET 视图感兴趣,而不仅仅是 VB.NET 视图
检查 e.Cancel 是否总是返回“正确”的结果,即使该事件最终可能会消耗一些时间?
您是否担心在事件处理程序执行完成之前DoDelete会测试 的值?e.Cancel
引发事件是一个阻塞操作,因此DoDelete在执行完所有处理程序之前不会继续执行。所以是的,e.Cancel将始终返回处理程序设置的值,即使处理程序需要一些时间来执行。