我在表单中创建了一个后台工作程序..
BackgroundWorker bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
另外,我在表单中有一个进度条控件(进度条最小值和最大值分别为1和100)。
点击我的按钮
其中click事件将触发应该在后台并行运行的实际方法调用,开始显示进度条步骤....
if (bw.IsBusy)
{
return;
}
bw.DoWork += (bwSender, bwArg) =>
{
MethodCall1(); - Does some database insertions..
MethodCall2(); - Does some database select...
}
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += (bwSender, bwArg) =>
{
bw.Dispose();
};
bw.RunWorkerAsync();
进度条显示进度......
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
我面临的问题是,进度条没有踩踏,它静止不动,没有进度条的进度。
我也尝试在我的实际方法中插入bw.ReportProgress(integervalue),但是,它没有帮助。
如何让后台工作线程处理方法调用并行显示进度条的进度,方法调用完成后,我想结束进度条步骤。
答案 0 :(得分:2)
正如评论中所述,您应该将事件的连接移动到表单构造函数或初始化方法。如果在每次单击按钮时将它们添加到BackgroundWorker,则方法将在第二次单击时执行两次,在第三次单击时执行三次等。
尝试在DoWork代码中调用方法后立即调用ReportProgress。正如汉斯所说,除非你非常清楚你的方法调用相对于彼此的时间长短,否则这不能真正准确地表示进度。
对于Dispose,BackgroundWorker继承自Component,它实现了IDisposable。但是,BackgroundWorker不会覆盖基本实现以实际处理任何内容,因此调用它只是将其从组件集合中删除。它不需要明确调用。
尝试这样的事情:
public partial class Form1 : Form
{
BackgroundWorker bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
public Form1()
{
InitializeComponent();
bw.DoWork += (bwSender, bwArg) =>
{
//MethodCall1(); - Does some database insertions..
bw.ReportProgress(50);
//MethodCall2(); - Does some database select...
bw.ReportProgress(100);
};
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += (bwSender, bwArg) =>
{
};
}
private void button1_Click(object sender, EventArgs e)
{
if (bw.IsBusy)
{
return;
}
bw.RunWorkerAsync();
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
}