我的WinForm调用了一个类来执行一些复制操作。我想在窗体上显示这个过程的进度。
我想使用Backgroundworker,但是我不知道如何从类向窗体(/backgroundworker)报告进度。
我的WinForm调用了一个类来执行一些复制操作。我想在窗体上显示这个过程的进度。
我想使用Backgroundworker,但是我不知道如何从类向窗体(/backgroundworker)报告进度。
使用BackgroundWorker的OnProgressChanged()方法来报告进度,并订阅ProgessChangedEvent以更新GUI中的进度。
您的复制类了解BackgroundWorker
并订阅ProgressChanged
。它还公开一个自己的ProgressChanged
事件,该事件由后台工作者的ProgressChanged
事件的事件处理程序引发。最后,您的Form
订阅复制类的ProgressChanged
事件并显示进度。
代码:
public class CopySomethingAsync
{
private BackgroundWorker _BackgroundWorker;
public event ProgressChangedEventHandler ProgressChanged;
public CopySomethingAsync()
{
// [...] create background worker, subscribe DoWork and RunWorkerCompleted
_BackgroundWorker.ProgressChanged += HandleProgressChanged;
}
private void HandleProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (ProgressChanged != null)
ProgressChanged.Invoke(this, e);
}
}
CopySomethingAsync
的ProgressChanged
事件并显示进度即可。这是通过当前的BackgroundWorker
对象的 ReportProgress
实例方法来完成的。你的窗体必须订阅 ProgressChanged
事件。
MSDN这里有一个简单的示例: http://msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
其中 backgroundWorker1_ProgressChanged
是您的事件处理方法的名称,由委托 ProgressChangedEventHandler
原型化。 - AndreasProgressChanged
事件。在您的情况下,有一个处理该事件的方法(backgroundWorker1_ProgressChanged
)。但是我的表单需要处理该事件,而不是我的类。 - MartijnBackgroundWorker
派生自己的类。可以给我们展示一些代码吗? - Andreas在你的类中调用
backgroundWorker.ReportProgress(i++);
在表单处理程序中的一个事件
//declare progressBar1 in the form and set range
// progressBar1.Minimum = 0;
//progressBar1.Maximum = 100;
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//show progress bar
}
ProgressChangedEventArgs
中的 ProgressPercentage
实例字段获取传递给 ReportProgress
的值,即 progressBar1.Value = e.ProgressPercentage;
。 - Andreas