VB.NET progressbar backgroundworker

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 - 这将适合您的使用,因为估计更新数据库所需的时间很难预测:

在此输入图像描述