C#进度条不显示WinForm

时间:2010-10-13 13:19:57

标签: c# winforms

当我点击按钮运行我的代码时,我的win表单会锁定并且我的进度条不会运行。我做错了什么?

foreach (string barcount in idit)
{
    barcountmax++;
}

label2.Text = "Total entries:  " + barcountmax;   
progressBar1.Minimum = 0;
progressBar1.Maximum = barcountmax;

...

foreach (string ids in idit)
{
    string[] splitids = ids.Split('|');
    string fixcommacrap = "";
    barmovement++;
    progressBar1.Value = barmovement;
}

我的Winform只是锁定和冻结,我无法看到进度条。

5 个答案:

答案 0 :(得分:5)

我的猜测是你正在UI线程中完成所有工作。不要那样做。

使用BackgroundWorker进行工作,定期更新进度条,使用ReportProgress允许在UI线程中进行UI更改。

如果你搜索BackgroundWorker教程,你会找到很多教程,例如this one。许多人会使用进度条给出示例,因为BackgroundWorker几乎是针对该场景设计的。

答案 1 :(得分:1)

默认情况下,如果您正在运行长操作,则winform不会自行重绘。要解决它,请考虑:

  1. 在单独的线程上运行计算,最好使用BackgroudWorker
  2. 每次更改进度条时手动重新绘制它。
  3. 强烈建议

    (1)。

答案 2 :(得分:1)

要使其工作,您需要在必要时让表单绘制。正确/首选的方法是使用工作线程(可能是BackgroundWorker)来执行长时间运行的任务,定期回调UI线程,要求它更新进度。

还有DoEvents,但(坦率地说)是黑客攻击。

答案 3 :(得分:1)

解决问题的最简单但不正确的方法是在循环中使用以下内容:

Application.DoEvents();

更具挑战性的是使用单独的线程进行计算,使用当前的UI线程来更新进度条。

答案 4 :(得分:0)

根据建议,使用BackGroundWorker。

在worker中,不要直接更新ProgressBar,而是使用BeginInvoke。