[英]Progress bar not being updated in a separate form using BackgroundWorker C# WinForms
I was accessing DB in button click event in Main UI我在主 UI 的按钮单击事件中访问数据库
private void button_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConString);
// sample query
string strSQL_Query = "SELECT COUNT(EmployeeID) FROM Employees";
SqlCommand cmd_QueryLength = new SqlCommand(strSQL_Query, con);
DataTable dt_Query = new DataTable();
if (con.State == ConnectionState.Closed)
con.Open();
dt_Query.Load(cmd_QueryLength.ExecuteReader());
con.Close();
// Do some work
}
Now I want to show progress bar while data is fetched from DB so I placed DB access code in现在我想在从数据库获取数据时显示进度条,所以我将数据库访问代码放入
private void backgroundWorker_start_DoWork(object sender, DoWorkEventArgs e)
{
SqlConnection con = new SqlConnection(ConString);
// sample query
string strSQL_Query = "SELECT COUNT(EmployeeID) FROM Employees";
SqlCommand cmd_QueryLength = new SqlCommand(strSQL_Query, con);
DataTable dt_Query = new DataTable();
if (con.State == ConnectionState.Closed)
con.Open();
dt_Query.Load(cmd_QueryLength.ExecuteReader());
con.Close();
// Do some work
for (int i = 0; i < 20; i++)
backgroundWorker_start.ReportProgress(i);
// Do some more work
for (int i = 0; i < 20; i++)
backgroundWorker_start.ReportProgress(i);
}
And I updated my click event as following.我更新了我的点击事件如下。
public MainForm()
{
InitializeComponent();
progressBarStart = new ProgressBar();
backgroundWorker_start = new BackgroundWorker();
backgroundWorker_start.WorkerReportsProgress = true;
}
private void button_Click(object sender, EventArgs e)
{
backgroundWorker_start.DoWork += new DoWorkEventHandler(backgroundWorker_start_DoWork);
backgroundWorker_start.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_start_ProgressChanged);
backgroundWorker_start.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_start_RunWorkerCompleted);
backgroundWorker_start.RunWorkerAsync();
}
private void backgroundWorker_start_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBarStart.Dispose();
}
void backgroundWorker_start_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarStart.Value = e.ProgressPercentage;
}
[UPDATE] My code is getting in to backgroundWorker_start_DoWork and completing my task however I can not see any progress in progress bar. [更新]我的代码正在进入 backgroundWorker_start_DoWork 并完成我的任务,但是我在进度条中看不到任何进度。 Do I need to update ProgressBar UI or is there something else I need to see.
我需要更新 ProgressBar UI 还是我需要查看其他内容。
Progress Bar UI Form contains a progress bar进度条 UI表单包含一个进度条
public partial class ProgressBar: Form
{
public ProgressBar()
{
InitializeComponent();
}
}
When button is clicked you create BackgroundWorker
, properly initialize it and start.单击按钮时,您将创建
BackgroundWorker
,正确初始化它并启动。 Put breakpoint inside backgroundWorker_start_DoWork
to see it.将断点放在
backgroundWorker_start_DoWork
以查看它。
What you did wrong is what你做错了什么
// Do some work
for (int i = 0; i < 20; i++)
backgroundWorker_start.ReportProgress(i);
doesn't actually do anything and BackgroundWorker
finishes immediately.实际上什么都不做,
BackgroundWorker
立即完成。
What you have to do: split your work into peaces, and report progress after each peace is completed.你要做的:把你的工作分成和平,并在每个和平完成后报告进度。 Try
尝试
// Do some work
for (int i = 0; i < 20; i++)
{
System.Threading.Thread.Sleep(200);
backgroundWorker_start.ReportProgress(i);
}
to actually see something happening.真正看到正在发生的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.