最初にこれを読んでください: Application.DoEvents() の使用
したがって、上記の回答を読んだ後は、二度と DoEvents を使用することはなく、DoEvents がなければ (および/または ProgressBar を無効にして Paint イベントが発生する)、「アップグレード プロセスが非常に集中しているため、プログレスバーはアニメーション化されません」
したがって、クトゥルフのコメント-「プログレスバーでダイアログを作成し、そのダイアログをモーダルにして、バックグラウンドワーカーでdb-stuffを実行できます。」最善の方法の 1 つです。
私が使用しているこれの 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
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
アプリケーションが起動してアップグレードを実行するときの呼び出しコードは次のとおりです。
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
いくつかのこととして、ユーザーがキャンセル (つまりlblClose_LinkClicked
) できないようにし、アップグレード中にユーザーがプロセスを強制終了したり、PC の電源を切ったりした場合に対処するために、保護/防御プログラミングを導入することができます。
また、ProgressBar は実際にはアニメーション GIF です。これは、データベースの更新にかかる時間を予測するのは非常に難しいため、用途に適しています。