Okay, I did some testing and it turns out that the problem lies with the progress bar animation. At the time your button gets enabled (which is correct) the progress bar is still in "animation mode". This can be verified by disabling XP visual styles.
The progress bar have a property name MarqueeAnimationSpeed, but unfortunately this have no effect when using Blocks
style.
I did a google search and found this SO post:
Disabling .NET progressbar animation when changing value?
Sample application
Imports System.Threading
Imports System.Threading.Tasks
Public Class Form1
Public Sub New()
Me.InitializeComponent()
Me.StartButton = New Button() With {.TabIndex = 0, .Dock = DockStyle.Top, .Text = "Start", .Height = 30}
Me.ProgressBar1 = New ProgressBar With {.TabIndex = 1, .Dock = DockStyle.Top, .Height = 30, .Name = "ProgressBar1"}
Me.ProgressBar2 = New ProgressBar With {.TabIndex = 2, .Dock = DockStyle.Top, .Height = 30, .Name = "ProgressBar2"}
Me.ProgressBar3 = New ProgressBar With {.TabIndex = 3, .Dock = DockStyle.Top, .Height = 30, .Name = "ProgressBar3"}
Me.ProgressBar4 = New ProgressBar With {.TabIndex = 4, .Dock = DockStyle.Top, .Height = 30, .Name = "ProgressBar4"}
Me.ProgressBar5 = New ProgressBar With {.TabIndex = 5, .Dock = DockStyle.Top, .Height = 30, .Name = "ProgressBar5"}
Me.Controls.AddRange({Me.ProgressBar5, Me.ProgressBar4, Me.ProgressBar3, Me.ProgressBar2, Me.ProgressBar1, Me.StartButton})
End Sub
Private Sub HandleStartButtonClicked(sender As Object, e As EventArgs) Handles StartButton.Click
Me.StartButton.Enabled = False
Dim tasks As Task() = New Task(4) {}
For i As Integer = 0 To 4
Dim index As Integer = i
tasks(i) = New Task(
Sub()
Dim n As Integer = rnd.Next(100, 1001)
For j As Integer = 0 To n
Me.Invoke(
Sub()
DirectCast(Me.Controls("ProgressBar" & (index + 1).ToString()), ProgressBar).Value = CInt((j / n) * 100.0#)
End Sub
)
Thread.Sleep(10)
Next
End Sub
)
Next
Task.Factory.ContinueWhenAll(tasks,
Sub() Me.Invoke(
Sub()
MessageBox.Show(String.Join(Environment.NewLine, From pb As ProgressBar In Me.Controls.OfType(Of ProgressBar)() Select (pb.Name & ": " & pb.Value.ToString())))
Me.StartButton.Enabled = True
End Sub
)
)
Array.ForEach(Of Task)(tasks, Sub(t) t.Start())
End Sub
Private WithEvents StartButton As Button
Private WithEvents ProgressBar1 As ProgressBar
Private WithEvents ProgressBar2 As ProgressBar
Private WithEvents ProgressBar3 As ProgressBar
Private WithEvents ProgressBar4 As ProgressBar
Private WithEvents ProgressBar5 As ProgressBar
Private Shared rnd As New Random()
End Class