正确使用CancelEventAgrs

本文关键字:CancelEventAgrs | 更新日期: 2023-09-27 18:15:01

我应该如何正确使用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。净一个

正确使用CancelEventAgrs

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

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

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

如果您将e.Cancel设置为True,则是。您的处理程序似乎没有设置它。如果您有多个处理程序处理该事件,那么最后更改e.Cancel的处理程序获胜。