VB.Net Loop冻结程序

时间:2014-12-30 21:28:00

标签: vb.net while-loop

我有一个循环,每秒增加一个进度条值。它工作正常,但如果你单击表单中的任何地方,窗口将变为白色,并显示“YOURTITLEHERE(无响应)”。 这是循环代码:

Private Sub incprogress()
    While ProgressBar1.Value < 1000
        ProgressBar1.Value += 1
        System.Threading.Thread.Sleep(1000)
    End While
End Sub

2 个答案:

答案 0 :(得分:4)

更好的是,使用每秒滴答一次的计时器。如果你不知道自己在做什么,最好不要使用Threads。

如果您查看工具箱,您将找到一个可以拖动到表单上的Timer控件。 将其间隔设置为1000,启用它,并处理其Tick事件以使事件每秒发生一次。

答案 1 :(得分:1)

如果您想在进度条更新(例如文件中的进程行或等待网络流量)之间执行比休眠更复杂的操作,则可以使用BackgroundWorker而不是Timer。设置起来有点复杂,但它可以让您完成GUI线程的所有繁重工作,以便GUI保持响应。

Public Class Form1
    Dim bgw As System.ComponentModel.BackgroundWorker
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        bgw = New System.ComponentModel.BackgroundWorker
        bgw.WorkerReportsProgress = True
        AddHandler bgw.DoWork, AddressOf bgw_DoWork
        AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
        bgw.RunWorkerAsync()
    End Sub

    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        While ProgressBar1.Value < 1000
            System.Threading.Thread.Sleep(1000) 'Optionally do some useful work here off the UI thread
            bgw.ReportProgress(0) 'optionally report a real percentage done
        End While
    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
        If ProgressBar1.Value < 1000 Then
            ProgressBar1.Value += 1 'optionally set progress bar to real percentage done
        End If
    End Sub
End Class