2013-03-20 60 views
0

我想弄清楚一种方法来使用事件,处理程序 - 从异步操作取消操作(进度栏)。VB.NET:添加取消事件处理程序从其他类

我有一个类ProgressBar,它显示了一个操作的进度。它有一个取消按钮(这是朋友WithEvents,通常生成,并有一个私人子ButtonCancel_click)。没什么特别的。

取消设置公共CancelButtonHasBeenPressed。

我希望能够在另一个类中按下Cancel按钮。

我读过关于添加处理程序以对事件作出反应,并在操作结束时删除处理程序的问题,这正是我应该做的。

是这样的:

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 

的与代码/伪上述问题:在AddHandler的

1),I应该补充说存在,连接到实际消除东西的事件 - 但ProgressBar中没有任何东西可以做到这一点 - 我如何添加取消?我只有一个取消按钮...所以我不得不做的button_click公开这可能是错误的...

不知何故,我想用户按下取消会触发该事件......这是不正确的?我对这一点真的很陌生,网络似乎假设,在所有例子中,看这些例子的人都已经是专家。

2)如何检查事件是否已被提出?

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

请帮我开始吧!

谢谢。

回答

0

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

另外,请不要在您的Mine函数中使用ByRef。如果有人维护你的代码没有意识到这个参数是ByRef,它不是必需的,并且可能导致在路上发生微妙的错误。

+0

我正在使用线程池,我想从线程池中的工作人员内部取消。我已经考虑过BackgroundWorker来调用设置整个事物的类,但是我没有在进度条的实际窗口上留有空间,这就是为什么我有一个单独的窗口。 Backgroundworker对多线程无济于事...... – Thalia 2013-03-20 17:25:57

+0

BackgroundWorker类使用线程池来运行,并且它不会绑定到任何类型的窗口,因此无论您在何处显示进度条和/或取消选项。如果你有其他要求处理多个线程等,那么你可能想要更新你的问题与这些额外的细节... – tcarvin 2013-03-20 17:52:13

+0

你是对的,这将是一个比我做的更干净的方法。我将不得不学习如何使用它 - 没有找到任何实际的例子,只有非常简单的例子,我没有用外部类和单独的进度条来实现。我简化了我的代码,不使用事件 - 因为我无法弄清楚,我可能会迟一点。我一直在研究使用BackgroundWorker--不是在这种情况下,而是通常在过去几周内,所以我将其标记为缺少替代方案的答案。 – Thalia 2013-03-21 20:58:43

相关问题