1

我想使用 BackgroundWorker 或 Thread 从我的 Windows 窗体中调用位于我的业务层中的类的方法。如果有人在听,我希望这个业务层中的方法能够报告它的进度,因为它可能需要一段时间才能完成。由于我可能从 BackgroundWorker 开始,然后决定使用常规线程,因此我不想与其中任何一个联系在一起。

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

框架中是否已经有一个代表?更好的是我可以实现的接口——比如 INotifyProgressChanged?

4

2 回答 2

0

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

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

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

于 2009-11-05T05:42:36.493 回答
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 方法)

于 2009-11-05T05:50:04.230 回答