从另一个类通知BackgroundWorker Progress Progress

时间:2009-11-05 05:35:11

标签: winforms backgroundworker ui-thread

我想使用BackgroundWorker或Thread从我的业务层中的类上的Windows窗体中调用方法。我希望此业务层中的方法能够在任何人正在收听时报告其进度,因为可能需要一段时间才能完成。 因为我可以从BackgroundWorker开始,然后决定使用常规线程,所以我不想被绑定。

如果方法不知道背景工作者是否调用它,那么报告其进度的最佳方法是什么? 我正在考虑在我的业务层类上提供一个事件,如果有人在听,它可以发布它的进度。

框架中是否有委托代表?更好的是我可以实现的接口 - 像INotifyProgressChanged?

2 个答案:

答案 0 :(得分:0)

我相信你正在通过触发事件处理程序走向正确的方向,你可以在你的类中声明一个事件(使用VB,C#当然是相似的):

Public Event foo(ByVal progressVar1 As Double, ByVal progressVar2 As String)

然后在你的winforms上添加一些处理程序。这里出现的问题是被触发的事件将在与背景工作者或线程相同的线程上执行,因此您仍然必须使用Invoke()方法来实际处理UI。

答案 1 :(得分:0)

您可以使用BackgroundWorker,以下是您可以订阅的一些事件,

   bgObj.DoWork += (sender, e)=>{ // do something in your business layer} 
   bgObj.RunWorkerCompleted += (sender, e)=>{ // do something}
   bgObj.ProgressChanged += (sender, e)=>{ // do something}      

或者,您可以在业务层中声明公共事件(是否实际工作),并在适当的位置引发事件,以便订阅者(例如从表单中)可以获取通知。

(注意除了UI线程之外,您可能无法更新UI控件,请查看control1.BeginInvoke方法)