Vb.net Net循环冻结程序

Vb.net Net循环冻结程序,vb.net,while-loop,Vb.net,While Loop,我有一个循环,每秒增加一个进度条值。它工作正常,但如果您单击表单中的任何位置,窗口将变为白色,并显示“YourTitle(无响应)”。 以下是循环代码: Private Sub incprogress() While ProgressBar1.Value < 1000 ProgressBar1.Value += 1 System.Threading.Thread.Sleep(1000) End While End Sub 私有子进程() 而

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

Private Sub incprogress()
    While ProgressBar1.Value < 1000
        ProgressBar1.Value += 1
        System.Threading.Thread.Sleep(1000)
    End While
End Sub
私有子进程()
而ProgressBar1.值<1000
ProgressBar1.值+=1
系统线程线程睡眠(1000)
结束时
端接头

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

如果在工具箱中查找,您会发现一个计时器控件,可以将其拖到窗体上。
将其间隔设置为1000,启用它,并处理其滴答事件,使其每秒发生一次。

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

如果在工具箱中查找,您会发现一个计时器控件,可以将其拖到窗体上。
将其间隔设置为1000,启用它,并处理其滴答事件,使其每秒发生一次。

如果您想在进度条更新之间执行比睡眠更复杂的操作(如文件中的进程行或等待网络流量),您可以使用BackgroundWorker而不是计时器。设置起来有点复杂,但它可以让您完成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
公共类表单1
作为System.ComponentModel.BackgroundWorker的Dim bgw
私有子表单1_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
bgw=新系统.ComponentModel.BackgroundWorker
bgw.WorkerReportsProgress=True
AddHandler bgw.DoWork,bgw_DoWork的地址
AddHandler bgw.ProgressChanged,bgw_ProgressChanged的地址
bgw.RunWorkerAsync()
端接头
私有子bgw_DoWork(ByVal发送方作为对象,ByVal e作为System.ComponentModel.DoWorkEventArgs)
而ProgressBar1.值<1000
System.Threading.Thread.Sleep(1000)”可以选择在UI线程之外执行一些有用的工作
bgw.ReportProgress(0)”可选择报告实际完成百分比
结束时
端接头
私有子bgw_ProgressChanged(ByVal发送方作为对象,ByVal e作为System.ComponentModel.ProgressChangedEventArgs)
如果ProgressBar1.值小于1000,则
ProgressBar1.Value+=1'可选择将进度条设置为实际完成百分比
如果结束
端接头
末级

如果您想在进度条更新之间执行比睡眠更复杂的操作(如文件中的进程行或等待网络流量),您可以使用BackgroundWorker而不是计时器。设置起来有点复杂,但它可以让您完成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
公共类表单1
作为System.ComponentModel.BackgroundWorker的Dim bgw
私有子表单1_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
bgw=新系统.ComponentModel.BackgroundWorker
bgw.WorkerReportsProgress=True
AddHandler bgw.DoWork,bgw_DoWork的地址
AddHandler bgw.ProgressChanged,bgw_ProgressChanged的地址
bgw.RunWorkerAsync()
端接头
私有子bgw_DoWork(ByVal发送方作为对象,ByVal e作为System.ComponentModel.DoWorkEventArgs)
而ProgressBar1.值<1000
System.Threading.Thread.Sleep(1000)”可以选择在UI线程之外执行一些有用的工作
bgw.ReportProgress(0)”可选择报告实际完成百分比
结束时
端接头
私有子bgw_ProgressChanged(ByVal发送方作为对象,ByVal e作为System.ComponentModel.ProgressChangedEventArgs)
如果ProgressBar1.值小于1000,则
ProgressBar1.Value+=1'可选择将进度条设置为实际完成百分比
如果结束
端接头
末级

不要阻止UI线程。@SLaks我是VB.Net新手,所以我不知道你的意思。你介意写一个示例代码吗?请检查:@HanletEscaño那不是VB.Net。你在做什么?…你到底在“跟踪”什么进度?不要阻止UI线程。@SLaks我对VB.Net不熟悉,所以我不知道你的意思。您是否介意编写一个示例代码?请查看:@HanletEscaño这不是VB.NetWhy you do this?…您“跟踪”的进度到底是什么?