简体   繁体   English

进度条不会使用 BackgroundWorker C# WinForms 在单独的表单中更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM