如何正确使用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
附言。
我放了 C# 标签,因为对一般的 .NET View 感兴趣,而不仅仅是 VB.NET View
最佳答案
Does checking e.Cancel will return always the "right" result, even if the event eventually could consume some time?
您是否担心 DoDelete
会在事件处理程序执行完成之前测试 e.Cancel
的值?
引发事件是一个阻塞操作,因此 DoDelete
的执行不会继续,直到所有处理程序都已执行。所以是的,e.Cancel
将始终返回处理程序设置的值,即使处理程序需要一些时间来执行。
关于c# - 正确使用 CancelEventAgrs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8184300/