c# - 正确使用 CancelEventAgrs

标签 c# .net 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

附言。
我放了 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/

相关文章:

c# - .NET Repeater HeaderTemplate

sql-server - 将日期保存到 SQL Server 表

C#:不使用按钮时,如何发送对话框的 OK 或 Cancel 返回消息?

c# - 像数字一样的顺序字符串

c# - 如何在 ASP.Net MVC 5 View 中获取 ApplicationUser 的自定义属性值?

c# - Global.asax.cs 文件在哪里?

c# - 带参数的照片上传到 PHP 页面

c# - IEnumerable<T> 未知类型保留类信息

c# - 从字符串中删除所有特殊字符

C#:在单例模式中仅初始化一次 Random()