【问题标题】:Make a BackgroundWorker so ProgressBar will work制作一个 BackgroundWorker,这样 ProgressBar 就可以工作了
【发布时间】:2017-03-01 19:47:49
【问题描述】:

我有一个程序,它的进度条在程序完成之前不会更新。我做了一些挖掘并发现我需要创建一个后台工作人员,以便它在我的 while 循环运行时更新。从显示的示例中,我只是没有得到我应该做的事情。有人可以向我解释一下如何设置它以及它在做什么吗?

int progressBar;

private void button3_Click(object sender, EventArgs e)
        {

            try
            {
                while (y < PriDID.Count)
                {
                    cmd.CommandText = "SELECT COUNT(*) FROM Accounts WHERE ACCT='" + ACCT[y] + "'";
                    int count = Convert.ToInt32(cmd.ExecuteScalar());

                    if (count < 1)
                    {
                        progressBar = (y / SDM_ACCT.Count) * 100;
                        progressBar1.Value = progressBar;
                        progressBar1.Update();
                        Console.WriteLine(SDM_ACCT[y - 1]);
                        cmd.CommandText = @"INSERT INTO Accounts(SDM_ACCT,Description) 
                                        values(" + "'" + ACCT[y] + "'," + "'" + Comment[y] + ")";
                        cmd.ExecuteNonQuery();
                        y++;
                        recordCount++;
                    }
                    else
                    {
                        y++;
                    }


                    MessageBox.Show(recordCount + " unique records successfully loaded to the Database.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception: " + ex.Message + " Please make sure you have selected a valid path for your CSV and database.");
            }

        }

【问题讨论】:

  • 您找到了哪些关于如何编写后台工作者的信息,以及您在实现它时遇到了哪些具体问题?
  • 我找到了这个,但我只是不明白如何使它适应我所拥有的。 stackoverflow.com/questions/6481304/…
  • 在适应您的情况时,您遇到了哪些具体问题?什么不适合你?
  • 只是推一个线程,或者做一些研究,无论哪个。
  • 我不明白应该把void worker_DoWork(object sender, DoWorkEventArgs e)放在哪里才能让它正常工作。

标签: c# progress-bar backgroundworker


【解决方案1】:

我认为,如果您查看此示例,您就会知道如何做到这一点。我组成了一些值并命名了与您相同的变量。如果你知道 while 循环运行需要多长时间,你可以声明一个 DoWork 只写这个 ---> progressBarWorker.DoWork+= 和双标签。你会得到一个 DoWork 事件处理程序。在那个事件处理程序中,您可以创建一个 for 循环)

for(int i = 0; i

{

Thread.Delay(100);

progressBarWorker.ReportProgress(i);

}

然后把 ProgressBarWorker.RunWorkerAsync();作为 button3 事件处理程序中的第一件事。

A BackroundWorker Example I made for you

【讨论】:

  • 收到错误“此 BackgroundWorker 声明它不报告进度。修改 WorkerReportsProgress 以声明它确实报告进度。”我错过了什么?
  • 你必须设置 ProgressBarWorker.WorkerReportsProgress = true;
  • 好的,这个例子给了我一个间歇性工作的进度条。有时我在progressBarWorker.ReportProgress(y); 上收到一条错误消息,上面写着“此操作已经调用了 OperationCompleted,并且进一步的调用是非法的。”即使这是第一次尝试运行该程序。
  • 这取决于您为“progressBarWorker.Maximum”设置的值。当您“ReportProgress”并且该值与“Maximum”相同时,它将引发 RunWorkerCompleted 事件并完成 BackroundWorker。
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多