在VB.NET中使用线程实现进度条

3

我目前有一个运行多个“强烈”查询的程序。我添加了一个文本框,当查询开始、结束以及剩余数量时呈现状态更新。这满足了我的需求,但是文本框直到所有查询都完成后才显示任何内容。我认为在另一个线程中更新文本框可以解决这个问题,但我不知道该怎么做。如何使用一个接收主表单运行查询消息并将其显示在文本框中的线程?

4个回答

8

BackgroundWorker组件适合您的需求(MSDN链接中有示例代码)。您需要处理它的DoWork事件并在其中执行实际查询。通过调用其ReportProgress方法来报告进度。要显示报告的进度,您应该处理其ProgressChanged事件并更新UI。通过调用后台工作程序的RunWorkerAsync方法来开始任务。使用BackgroundWorker可以使您免于手动启动和停止线程以及与UI线程通信以更新进度条。


哈哈,我正想说呢。我似乎永远都回答不够快。 - jrsconfitto
哈哈,我甚至没有考虑过在不同的线程中执行查询。我会试一下这个方法。 - Shawn
@Jugglingnutcase - 我总是遇到同样的问题!前几天我回答了一个问题,给出了与其他人完全相同的答案,并指向了相同的URL,但他比我快了5秒钟,哈哈。 - Dave7896
1
@Dave7896,但这好像并没有阻止其他人回答同样的问题,是吧? - jrsconfitto

3
BackgroundWorker是一个很好的通用方法,可以在后台线程上进行密集的工作。但是,由于您的问题听起来像是在进行数据库操作,因此使用ADO.Net中的异步操作的本地支持可能更容易。您可以使用回调函数来处理进度条。请参见:本地支持回调函数

1

最简单的方法是利用BackgroundWorker,处理它的DoWork事件,并使用ProgressChanged事件向ProgressBar报告进度。

开始:

worker.RunAsync()

报告进度:

worker.ReportProgress(10) 'for 10%

1

在Mehrdad和Alex的回答基础上,以下是如何处理由ReportProgess方法(ProgressChanged)引发的事件以更新进度条:

Private Sub backgroundWorker_ProgressChanged ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles backgroundWorker.ProgressChanged

    Me.progressBar1.Value = e.ProgressPercentage

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接