我可以在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
答案 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