【问题标题】:How to sync ProgressBar in a loop如何在循环中同步 ProgressBar
【发布时间】:2015-01-12 23:48:21
【问题描述】:

我尝试在循环中同步进度条并填充标签连续数字。但是我的标签比进度条更早完成。下图就是这种情况。

我使用第二个线程来完成这个漫长的过程。这是我的测试代码:

Public Class Form1

    Dim watek As System.Threading.Thread

    Public Sub New()
        InitializeComponent()
        Control.CheckForIllegalCrossThreadCalls = False
    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        watek = New System.Threading.Thread(AddressOf DoSomething)
        watek.Start()
    End Sub


    Private Sub DoSomething()
        Dim i As Integer = 0
        Dim max As Integer = 10000
        ProgressBar1.Maximum = max
        ProgressBar1.Step = 1

        Do Until i > ProgressBar1.Maximum
            ProgressBar1.PerformStep()
            Label1.Text = i
            i = i + 1
        Loop
    End Sub
End Class

这是我的问题 - 为什么会这样?为什么进度条与标签不同步?请问谁能给我解释一下?如何得到预期的结果?

【问题讨论】:

  • 呃,永远不要这样做:Control.CheckForIllegalCrossThreadCalls = False。只需阅读使用 BackgroundWorker。
  • 或阅读委托 - 这就是您从差异线程访问控件的方式。

标签: .net vb.net multithreading winforms progress-bar


【解决方案1】:

进度条总是需要一些“刷新”时间。

您可以将 Progressbar 的值设置为 1000,它需要大约 2 秒才能完全填充到该值。

试试这个:

For i = 0 to max
    ProgressBar1.PerformStep()
    If (i mod 100) = 0 Then
        Application.Doevents()
    End If
Next

注意:如果编码 (Control.CheckForIllegalCrossThreadCalls = False),我不会宽恕你的方式,但那不是 立即发布

【讨论】:

    【解决方案2】:

    你可以在这里做的一件事是检查进度条的最大值是否出现在标签中,如果它出现了,但该值仍然没有显示,那么它应该只是写“this.Refresh();”这将强制在 UI 上显示更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      相关资源
      最近更新 更多