Winforms 通知BackgroundWorker另一个类的进度更改

Winforms 通知BackgroundWorker另一个类的进度更改,winforms,backgroundworker,ui-thread,Winforms,Backgroundworker,Ui Thread,我想使用BackgroundWorker或线程在位于业务层的类上从windows窗体调用方法。我希望这个业务层中的方法能够报告它的进度,如果有人在听,因为它可能需要一段时间才能完成。 因为我可能从一个BackgroundWorker开始,然后决定使用一个普通线程,所以我不想被这两个线程束缚住 如果一个方法不知道是否被后台工作人员调用,那么该方法报告其进度的最佳方式是什么? 我在考虑在我的业务层类上提供一个事件,如果有人在听的话,可以发布它的进度 框架中是否已经有一名代表负责此项工作?更好的是,我

我想使用BackgroundWorker或线程在位于业务层的类上从windows窗体调用方法。我希望这个业务层中的方法能够报告它的进度,如果有人在听,因为它可能需要一段时间才能完成。 因为我可能从一个BackgroundWorker开始,然后决定使用一个普通线程,所以我不想被这两个线程束缚住

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


框架中是否已经有一名代表负责此项工作?更好的是,我可以实现一个接口,比如INotifyProgressChanged?

我相信您启动事件处理程序的方向是正确的,您可以在类中声明一个事件(当然,使用VB,C类似),如下所示:


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

您可以利用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方法)

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