Ten en cuenta, que una cosa son los campos (o lógica) del control, y luego, la UI. Ya te has dado cuenta por ti mismo de que la barra de progeso SÍ que llega a 100, puesto que el campo ProgressBar.Value así lo indica, pero si la UI se tuviera que actualizar/dibujar con la misma constancia, entonces la UI se volvería muy deficiente y propensa a constantes congelamientos, aparte, los efectos visuales de degradados y destellos y demás florituras, como el efecto de relleno 3D de una progressbar, requieren más trabajo/tiempo de ejecución.
Viendo el código fuente online, el método Increment o PerformStep lo único que hacen es llamar a la función Win32 SendMessage para enviar el mensaje que actualiza la posición, a la cola de mensajes del control, y este mensaje se procesará cuando se desocupe el resto de mensajes que están siendo procesados constantemente por el control, suele ser algo "instantaneo", pero no tiene por que serlo, igual que el redibujado del control para mostrar esos cambios, tampoco tiene que ser instantaneo, sino cuando sucede "algo" que llame al invocador de ese evento para dispararlo.
En resumen, que es lo más normal del mundo, aunque para entenderlo mejor habría que conocer el código fuente de la función SendMessage para ver como funciona, y sobre todo entender a fondo como funciona la cola de mensajes para ventanas Win32, cosa que yo no se a ciencia cierta, lo que si se es que si dejas el tiempo necesario para que se procese el mensaje y se pueda actualizar la UI (unos ms), entonces puedes comprobar como si que se completa la barra de progreso hasta el final:
Saludos.
Viendo el código fuente online, el método Increment o PerformStep lo único que hacen es llamar a la función Win32 SendMessage para enviar el mensaje que actualiza la posición, a la cola de mensajes del control, y este mensaje se procesará cuando se desocupe el resto de mensajes que están siendo procesados constantemente por el control, suele ser algo "instantaneo", pero no tiene por que serlo, igual que el redibujado del control para mostrar esos cambios, tampoco tiene que ser instantaneo, sino cuando sucede "algo" que llame al invocador de ese evento para dispararlo.
Código (csharp) [Seleccionar]
private void UpdatePos() {
if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETPOS, value, 0);
}
En resumen, que es lo más normal del mundo, aunque para entenderlo mejor habría que conocer el código fuente de la función SendMessage para ver como funciona, y sobre todo entender a fondo como funciona la cola de mensajes para ventanas Win32, cosa que yo no se a ciencia cierta, lo que si se es que si dejas el tiempo necesario para que se procese el mensaje y se pueda actualizar la UI (unos ms), entonces puedes comprobar como si que se completa la barra de progreso hasta el final:
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form
Friend WithEvents Timer1 As New System.Windows.Forms.Timer With {.Interval = 20}
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Shown
Me.ProgressBar1.Step = 1
Me.Timer1.Start()
End Sub
Private Sub IncreaseProgressBar(ByVal sender As Object, ByVal e As EventArgs) _
Handles Timer1.Tick
Me.ProgressBar1.PerformStep()
If (Me.ProgressBar1.Value = Me.ProgressBar1.Maximum) Then
Me.Timer1.Stop()
MsgBox("done") ' unos ms despues de saltar el msgbox verás como se completa la barra.
MyBase.Close()
End If
End Sub
End Class
Saludos.