我在vb.net上写过进度条。我想的是有一种比这更好的方法。
以下是我的代码:
Private Function ImportDataFiles(ByRef pobjDataLoadDTO As DataLoadDTO) As Boolean
Try
lblStatus.Visible = True
lblStatus.Text = ""
myProgressBar.Visible = True
myProgressBar.Value = 0
For Each drRow As ImportData.TRow In pobjDataLoadDTO.FileInfo.Select("categ_code = 'abc'")
If pobjDataLoadDTO.FileTimes.ContainsKey(drRow.KEY_CODE) AndAlso _
pobjDataLoadDTO.FileTimes(drRow.KEY_CODE) > pobjDataLoadDTO.UploadTimes(drRow.KEY_CODE) Then
pobjDataLoadDTO.DestinationTablename = drRow.KEY_CODE
If mobjDataLoadBO.ImportDataFiles(pobjDataLoadDTO) Then
drRow.DATA_TXT = mobjCommonBO.ONow.ToString
End If
End If
lblStatus.Text = drRow.KEY_CODE.Trim & "is loading...."
lblStatus.Refresh()
myProgressBar.PerformStep()
lblStatus.Refresh()
Next
Return True
Catch ex As Exception
Return False
End Try
End Function
现在它正在工作,但我想使用更高效的方式,比如使用Backgroundworkerprocess ...等,对此有什么想法?
答案 0 :(得分:1)
由于你的函数在主线程中运行,我认为你的应用程序在上传过程中是冻结的并且不是很平滑。
1 - 删除表单上的Backgroundworker控件
2 - set" reportProgress"工人的财产为" True"
3 - 将您的循环代码移动到" DoWork"工人控制的事件。并调用worker.RunWorkerAsync。您可以将所需的参数传递给它
4-刷新进度条的代码进入" ProgressChange"工人的事件。这很重要,因为您无法从工作线程调用控件。和ProgressChange正在主线程中运行。您也可以删除"刷新"方法调用。这将不再需要了。每次要刷新进度条时都会调用" ReportProgress"工人的方法
5-Use" RunWorkerCompleted"工作人员事件,进行清理,并隐藏进度条
在启动之前检查工人是否已经工作也是一个好主意,比如
If worker.IsBusy Then
If worker.CancellationPending = False Then
worker.CancelAsync()
End If
Exit Sub
End If