【问题标题】:VB.NET: Add Cancel Event Handler From Other ClassVB.NET:从其他类添加取消事件处理程序
【发布时间】:2013-03-09 19:12:36
【问题描述】:

我正在尝试找出一种使用事件、处理程序的方法 - 从异步操作中取消操作(进度条)。

我有一个类 ProgressBar,它显示操作的进度。它有一个 Cancel 按钮(它是 Friend WithEvents,通常生成,并且有一个 Private Sub ButtonCancel_click)。没什么特别的。

Cancel 设置一个公共的 CancelButtonHasBeenPressed。

我希望能够在另一个班级中对按下取消做出反应。

我阅读了有关添加处理程序以响应事件,并在操作结束时删除处理程序的信息,这是我应该做的。

类似:

Public Function Mine(ByRef myProgress As ThatProgressWindow)
  ' some setup  
  AddHandler CancelEvent, AddressOf myProgress.ButtonCancel_Click
  ' create and call workers
  RemoveHandler CancelEvent, AddressOf myProgress.ButtonCancel_Click
End Function
Public Event CancelEvent()
Private Function worker(ByVal state As Object) As Object
  ' do work
  If ' how do I check for the event ? Then drop everything and run
End Function

上面代码/伪代码的问题:

1) 在 AddHandler 中,我应该添加一个存在的事件,该事件与实际取消相关联 - 但 ProgressBar 中没有任何内容,可以这样做 - 如何添加取消?我只有一个取消按钮...所以我不得不将 button_click 设为公开,这可能是错误的...

不知何故,我在想用户按下取消会触发那个事件......这不是真的吗?我对此真的很陌生,而且网络似乎在所有示例中都假设查看这些示例的人已经是专家。

2) 如何检查事件是否已引发?

当我尝试以任何形式键入“If”后跟事件名称时,Intellisense 一直告诉我这是错误的。

请帮我开始!

谢谢。

【问题讨论】:

    标签: vb.net event-handling progress-bar


    【解决方案1】:

    您是否考虑过使用BackgroundWorker?它支持进度事件和取消。

    顺便说一句,不要在Mine 函数中使用ByRef。这不是必需的,如果维护您的代码的人没有意识到参数是ByRef,可能会导致细微的错误。

    【讨论】:

    • 我正在使用线程池,我想从线程池的工作人员内部取消。我已经考虑将 BackgroundWorker 用于调用设置整个事情的类......但我在真实窗口上没有空间用于进度条,这就是为什么我有一个单独的窗口。无论如何,Backgroundworker 对多个线程都没有帮助......
    • BackgroundWorker 类使用线程池运行,并且它不绑定到任何类型的窗口,因此无论您在哪里显示进度条和/或取消选项都无关紧要。如果您有其他要求处理多个线程等,那么您可能需要使用这些额外的详细信息来更新您的问题...
    • 你是对的,这将是比我所做的更清洁的方法。我将不得不学习如何使用它 - 没有找到任何实际示例,只有非常简单的示例,我无法使用外部类和单独的进度条来实现。我已经简化了我的代码以不使用事件——因为我不知道怎么做,以后可能会。我一直在考虑使用 BackgroundWorker - 不是在这种情况下,但一般来说,在过去的几周里,所以我会将此标记为缺乏替代方案的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多