tmi*_*hty 9 vb.net backgroundworker progress-bar
当我的应用程序启动时,它刚刚升级,我正在进行本地数据库更新(sqlite).
它是这样的:用户启动我的应用程序,然后我开始升级过程.在此升级过程中,我将显示一个具有连续进度条的表单.升级过程完成后,此表单将关闭,然后用户可以开始使用我的应用程序.
但由于升级过程非常密集,因此进度条不会生成动画.
在我的旧版VB6中,我使用了一个ActiveX-Exe,它有一个表单并显示一个进度条.这是我的"背景工作者".
我不确定我是否可以在VB.NET中使用相同的方法.
我只看到了后台工作者的工作,但我没有看到任何示例,其中progressbar本身是后台工作者.
数据库升级需要阻止,用户可能在数据库升级完成之前不使用我的应用程序.这意味着只有进度条应该"进行中",而不是升级.
非常感谢你!
Jer*_*son 12
首先阅读:Application.DoEvents()的使用
因此,在阅读上述答案之后,您将永远不会再次使用DoEvents,并且没有DoEvents(和/或使ProgressBar失效以使其Paint事件触发),"进度条将不会生成动画,因为升级过程非常密集"
因此,Cthulhu的评论 - "您可以使用进度条进行对话,使该对话框模态化并在后台工作者上执行您的数据库内容." 是最好的前进方式之一.
我已经翻译了我使用的C#实现,你应该可以直接删除它.
这是ProgressBar表单:
Public Partial Class ThinkingProgressBar
Inherits Form
Private startTime As System.DateTime = DateTime.Now
Public Sub New()
InitializeComponent()
End Sub
Private Sub lblClose_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs)
Me.Tag = "Cancelled"
Me.Hide()
End Sub
Public Sub SetThinkingBar(ByVal switchedOn As Boolean)
If switchedOn Then
lblTime.Text = "0:00:00"
startTime = DateTime.Now
Timer1.Enabled = True
Timer1.Start()
Else
Timer1.Enabled = False
Timer1.Stop()
End If
End Sub
Private Sub timer1_Tick(sender As Object, e As EventArgs)
Dim diff As New TimeSpan()
diff = DateTime.Now.Subtract(startTime)
lblTime.Text = diff.Hours & ":" & diff.Minutes.ToString("00") & ":" & diff.Seconds.ToString("00")
lblTime.Invalidate()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
将BackgroundWorker控件拖放到窗体上,以下是后台工作程序事件:
Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
e.Result = e.Argument
'DirectCast(e.Result, ThinkingProgressBar).SetThinkingBar(True)
'DO LONG OPERATION HERE
End Sub
Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Dim dlg As ThinkingProgressBar = TryCast(e.Result, ThinkingProgressBar)
If IsNothing(dlg) = False Then
dlg.SetThinkingBar(False)
dlg.Close()
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
以下是应用程序启动和升级时的调用代码:
Dim dlg As New ThinkingProgressBar()
dlg.SetThinkingBar(True)
BackgroundWorker1.RunWorkerAsync(dlg)
dlg.ShowDialog()
If IsNothing(dlg.Tag) = False AndAlso dlg.Tag.ToString() = "Cancelled" Then
Return
End If
Run Code Online (Sandbox Code Playgroud)
有些事情,您可以阻止用户取消(即lblClose_LinkClicked)并进行保护/防御性编程以处理用户在升级过程中杀死进程或关闭其PC的情况.
而ProgressBar实际上是一个动画gif - 这将适合您的使用,因为估计更新数据库所需的时间很难预测:

| 归档时间: |
|
| 查看次数: |
29234 次 |
| 最近记录: |