正确使用CancelEventAgrs

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 视图

Tho*_*que 5

检查 e.Cancel 是否总是返回“正确”的结果,即使该事件最终可能会消耗一些时间?

您是否担心在事件处理程序执行完成之前DoDelete会测试 的值?e.Cancel

引发事件是一个阻塞操作,因此DoDelete在执行完所有处理程序之前不会继续执行。所以是的,e.Cancel将始终返回处理程序设置的值,即使处理程序需要一些时间来执行。