我有一个代码设置,可以循环并执行一些网络固件功能。对于用户,我有一个弹出的进度条表单,并在发生时向他们显示状态。代码很简单:
ProgressBar.Show()
For j As Integer = 0 To datagridview.Rows.Count - 1
'do network functions
ProgressBar.ProgressBar1.Increment(100 / (datagridview.Rows.Count))
next
ProgressBar.Close()
ProgressBar是表单的名称,上面有进度条。这是一个非常简单的形式。 因此,如果我在"为"设置一个断点。线,即j = 0,我的进度条看起来像这样:
嗯,这没有给出任何信息。如果我走到下面的增量线的点,它显示!
我认为如果我之前添加一些进度条增量,则该条将填充。所以我试过了。所以我将其改为:
ProgressBar.Show()
ProgressBar.ProgressBar1.Increment(100 / (datagridview.Rows.Count+1))
For j As Integer = 0 To datagridview.Rows.Count - 1
'do network functions
ProgressBar.ProgressBar1.Increment(100 / (datagridview.Rows.Count+1))
next
ProgressBar.Close()
然而,如果我在断点处停在for循环中,我仍然会有一个白色条而不是绿色条。我究竟做错了什么?我觉得这是简单/ noob级别的东西。赞赏。
答案 0 :(得分:2)
@Hans Passant的评论是正确的。您的UI线程卡住了。它正在等待你的后台线程(即你的循环代码)在重新绘制屏幕之前完成 当我使用进度条时,我在循环中调用DoEvents(),如下所示:
ProgressBar.Show()
ProgressBar.ProgressBar1.Increment(100 / (datagridview.Rows.Count+1))
For j As Integer = 0 To datagridview.Rows.Count - 1
'do network functions
ProgressBar.ProgressBar1.Increment(100 / (datagridview.Rows.Count+1))
'force .NET to update the forground thread, so the progress bar looks like it should
Application.DoEvents()
Next
ProgressBar.Close()
对DoEvents的调用,基本上会暂停后台执行,直到UI有时间更新,然后继续后台执行。