【发布时间】:2012-01-26 14:21:23
【问题描述】:
团队,
我已经构建了一个 VB.Net windows 应用程序,它确实将数据上传到数据库并基本上更新了两个控件:
1. 一个不断更新的文本框,每个数据库记录上传一行。
2. 记录上传数据库记录数的标签。
我使用了BackgroundWorker thread 概念,其中线程的 bgwWorker_DoWork() 方法包含上传的业务逻辑,bgwWorker_ProgressChanged() 根据上传更新 2 个 UI 控件。
但我面临的问题是我没有获得两个 UI 控件的完整更新。有时线程会绕过文本框的更新,有时会绕过标签的更新。我可以通过在每个 UI 控件更新代码之前添加 System.Threading.Thread.Sleep(25) 来解决此问题。这是解决问题的正确方法吗?或者有什么我遗漏的吗?
请提出建议。
以下是这两种方法的代码:
Private Sub bgwWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwWorker.DoWork
.................
.................
'Updates database record related update in textbox
System.Threading.Thread.Sleep(25)
updater.eventName = "UpdateStatusBox"
updater.errorMessageToLog = String.Empty
updater.errorMessageToLog += GetErrorMessage(dataTable(rowNumber)("Name").ToString(), ExceptionData)
bgwWorker.ReportProgress(1, updater)
.................
.................
'Updates Status Count in LABEL
System.Threading.Thread.Sleep(25)
updater.eventName = "UpdateStatusBar"
updater.successCount = successCount.ToString()
updater.failureCount = failureCount.ToString()
bgwWorker.ReportProgress(2, updater)
End Sub
Private Sub bgwWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As ProgressChangedEventArgs) Handles bgwWorker.ProgressChanged
Dim updater As UIUpdater = TryCast(e.UserState, UIUpdater)
..........................................
If updater.eventName = "UpdateStatusBar" Then
UpdateStatusBar(updater.successCount, updater.failureCount)
ElseIf updater.eventName = "UpdateStatusBox" Then
txtUpdates.Text = txtUpdates.Text & updater.errorMessageToLog
End If
.....................................
End Sub
【问题讨论】:
标签: vb.net winforms backgroundworker