【问题标题】:progress bar using backgroundworker使用后台工作者的进度条
【发布时间】:2012-11-14 10:16:49
【问题描述】:

关于如何实现进度条有很多问题,我相信我已经通过所有这些问题,但我仍然不知道为什么我的进度条不起作用。

嗯,看来是要等操作完成后才起作用,这当然不是我想要的。我希望进度条能够正常工作,因为主要操作正在做它的事情。

我的代码很长而且很痛苦,所以我将对其进行简化,使其尽可能基本。

private void button1_Click(object sender, EventArgs e)
{
  backgroundWorker1.RunWorkerAsync();
  //Main UI Operation
}

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
 for (int i = 1; i <= 100; i++)
  {
   // Wait 100 milliseconds.
   Thread.Sleep(100);
   // Report progress.
   backgroundWorker1.ReportProgress(i);     }
  }

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs        e)
  {
   progressBar1.Value = e.ProgressPercentage;
  }

就像我说的,我只在主 UI 操作后才看到进度条。

WorkerReportsProgress 设置为 True。 最小值和最大值分别为 0 和 100。

我觉得这可能是对线程缺乏了解。

【问题讨论】:

  • “// 主 UI 操作”是否意味着活动发生在此处而您已将其忽略?如果是这样,那是你的问题。如果button1_Click() 立即返回,则问题出在其他地方。
  • Siride,“\\Main UI Operation”是我调用需要大量时间才能完成的方法的地方。为什么这是一个问题,我该如何解决?我的方法是否准确,或者您会采取不同的方式吗?
  • 您是否确保将事件连接到回调。打开后台worker的属性,点击闪电,就可以看到事件回调了。确保您需要的那些具有适当的方法名称。我测试了你的代码,但发现我错过了这一步。

标签: c# multithreading progress-bar


【解决方案1】:

我测试了与您相同的代码,发现它有效。您是否忘记将WorkerReportesProress 属性更改为True

【讨论】:

  • 是的,我确定它设置为 True
  • 很抱歉没有注意到这一点。我认为您应该将Main UI Operation 拆分为小步,并将Thread.Sleep(100); 替换为一步。或者您可以创建一个新的 BackgroundWorker 对象并将//Main UI Operation 放入其中。
  • 因为进度条更新和按钮点击都在UI线程中运行,所以在button1_click返回之前不会运行进度条事件。
  • 啊我明白了,是因为它们都在同一个线程中运行,它们不能同时处理吗? Main UI Operation 不能拆分...什么会触发 BackgroundWorker 对象?我绝对需要Main UI Operation 在按钮单击时运行。
  • like this: private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); backgroundWorker2.RunWorkerAsync(); //run Main UI Operation in backgroundWorker2_DoWork and fire a notification when completed. } 但是不能拆分怎么知道 ProgressPercentage 呢?
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2011-05-18
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多