使用进度条跟踪循环进度而不影响循环速度VB

时间:2018-04-19 12:39:55

标签: vb.net

我可以在Do循环中增加一个进度条,但它会大大影响循环的速度。如何在不影响Do Until循环的情况下跟踪其进度?

Do Until temp = pbTemp2
temp+= 1
progressbar1.increment(1) '<--- i dont want this in here but still need to track the progress
loop

1 个答案:

答案 0 :(得分:0)

Visual Vincent提议和BackgroudWorker之间的中间地带 (我假设这与.NET WinForms)有关。

创建线程以执行某些工作,并使用SynchronizationContext将结果排列到UI上下文。

SynchronizationContext然后将通过SendOrPostCallback委托将异步消息分派给同步上下文,该委托将在该上下文中执行其详细说明。在这种情况下的UI线程。

异步消息使用SynchronizationContext.Post方法发送。

UI线程不会冻结,可以用来同时执行其他任务。

这是如何工作的:
- 定义一个与某些UI控件交互的方法:
SyncCallback = New SendOrPostCallback(AddressOf Me.UpdateProgress)
- 初始化一个新线程,指定线程将使用的工作方法。
Dim pThread As New Thread(AddressOf Progress)
- 启动线程,可以将参数传递给worker方法,在这种情况下是进度条的最大值。
pThread.Start(MaxValue)
- 当worker方法需要将其进度报告回(UI)上下文时,可以使用Post()的非同步SynchronizationContext方法完成此操作。 的 SyncContext.Post(SyncCallback, temp)

  

这里,线程是使用Button.Click事件启动的,但它可以   别的什么。

Imports System.Threading

Private SyncContext As SynchronizationContext
Private SyncCallback As SendOrPostCallback

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button11.Click
    SyncContext = WindowsFormsSynchronizationContext.Current
    SyncCallback = New SendOrPostCallback(AddressOf Me.UpdateProgress)
    Dim MaxValue As Integer = ProgressBar1.Maximum

    Dim pThread As New Thread(AddressOf Progress)
    pThread.IsBackground = True
    pThread.Start(MaxValue)
End Sub

Private Sub UpdateProgress(state As Object)
    ProgressBar1.Value = CInt(state)
End Sub

Private Sub Progress(parameter As Object)
    Dim temp As Integer = 0
    Dim MaxValue As Integer = CType(parameter, Integer)
    Do
        temp += 1
        SyncContext.Post(SyncCallback, temp)
    Loop While temp < MaxValue
End Sub