3

尝试 2。尽量保持清晰,因为我从事这项任务的时间比我应该做的要长得多,而且进展甚微。

我需要为应用程序制作进度条。现在,一切都发生在一个 UI 线程中,所有处理等等,所以当我在单击一个按钮后执行长时间运行的过程时,程序挂起大约 40 秒,然后恢复输出(我无法更改部分,申请是给我的)。而且我还必须做一个取消按钮,所以如果在中间过程中被击中,在该过程完成后,它会检查取消标志,如果它是ON,则打破所有方法并返回初始位置.

我要做的是为这个过程制作一个进度条。其中两个,一个用于中间过程,一个用于总过程。中间是一个小动作,像DB调用,输出中间过程(for和foreach循环)。

我尝试将这些条放在同一个 UI 窗口中,并在我继续进行时在同一个线程中更新它们(找到要点,从那里开始进度条并根据我的判断增加它们。和循环)。那只是更多地加载 UI,但它正在工作(不连贯的进度条移动)。

然后我尝试使用后台工作人员。同样的,将条形图放在 UI 中并通过后台工作程序运行它们。问题在于,即使 BG 工作程序运行,刷新也必须发生在 UI 窗口中,该窗口正忙于处理贪婪请求,所以当我想要它时它不会更新。

我尝试在核心使用多线程(无 BG 工作线程)并在新线程中创建一个新表单以反映进度,但我被警告不要这样做(同时运行 2 个 UI 线程)并且我遇到了麻烦传递周围的价值观。更不用说如果使用线程方法,如果不完全使 CPU 过载(让另一个线程在一段时间内运行(true)并在您从某个点调用 updateMethod 时进行更新),就不可能获得正在发生的进度的准确表示。过程)

我还有其他选择吗?因为最不负面的方面是我在执行程序时更新进度条的第一个方面。

4

3 回答 3

3

我还有其他选择吗? 是和不是。最好的选择仍然是花时间学习如何正确使用 backgroundworker,这是迄今为止解决这个问题的最简单的方法。

继续研究这些链接:

最重要的是设置这个属性:

bw.WorkerReportsProgress = true;

在 DoWork-Function 中,确保向 UI 报告进度,如链接示例中所示:

worker.ReportProgress((i * 10));

另外,不要忘记在 UI 中处理 progresschanged 事件:

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
}

继续,你会看到:它相当简单。

于 2013-05-17T19:07:27.233 回答
2

使用后台工作人员时,您应该在后台工作人员中进行所有非 UI 处理;您不应该在 UI 线程中进行处理时使用它来更新 UI。

通过将工作移至DoWorkBGW 的处理程序,您可以释放 UI 线程以允许它处理 UI 事件,包括更新进度条。

于 2013-05-17T19:46:12.073 回答
-2
private void btnCreate_Click(object sender, EventArgs e)
  {
      Progressbar1.Minimum = 1;

      Progressbar1.Maximum = dt.Rows.Count;

      Progressbar1.Value = 1;

      Progressbar1.Step = 1;


     for (int i = 1; i <= dt.Rows.Count; i++)
     {
            bool result=InsertUserdetails(Username);

            if(result== true)
            {
                 Progressbar1.PerformStep();
             }
     }
  }
于 2013-05-17T18:59:38.763 回答