La situación de ejemplo es la siguiente:
Suponemos un cronometro inverso, que cuente los segundos que faltan para que acabe un proceso. De esta forma podremos usar los segundos que faltan para actualizar la propiedad [value] del ProgressBar.
Esta clase es un objeto VO (Value Object) y se utiliza para mover la información desde el hilo al formulario y asi mover el ProgressBar
Código VB
' /** ' --------------------------------------------- ' [- (A) Contenido -] ' --------------------------------------------- ' [- Versión -] = 23.09.16.1407. ' [- Nombre Clase -] = DatosDevueltos. ' ------------- ' [- Descripción -] = ' Clase VO que se usa para mover información desde el Task asíncrono ' al formulario principal durante el informe de progreso. ' ------------- ' [- Observaciones -] = ' Recibe, (a través del constructor) el numero de segundos que faltan ' para que termine el proceso y calcula en formato texto y ' formateado como tiempo, el tiempo que falta para que termine ' ' Ejemplo recibe 200 segundos y devuelve la cadena "03:20" ' ' Esta clase forma parte de un proyecto de prueba para estudiar ' como se puede actualizar un control [ProgressBar] desde un Hilo ' usando las clases [Task] y [Progress] (Informes de progreso). ' ------------- ' [- CodigoEjemplo -] = ' ' informe de progreso ' If progress IsNot Nothing Then ' Dim objDatosVO As New DatosDevueltos(i) ' progress.Report(objDatosVO) ' End If ' -- ' Para el informe de progreso. ' Dim progress As New Progress(Of DatosDevueltos)(Sub(ByVal paramObjDatosVO As DatosDevueltos) ' pbStatus.Value = paramObjDatosVO.NumeroDeSegundos ' TextBoxCronometro.Text = paramObjDatosVO.TextoTiempoRestante ' End Sub). ' --------------------------------------------- ' [- (B) Información básica -] ' --------------------------------------------- ' [- Module Name -] = DatosDevueltos.vb. ' [- Propietario -] = AGUILA\Cuenta de Trabajo. ' [- Type -] = vb/file. ' [- Size -] = 4,83 KB - [4945 Bytes]. ' [- Lenguaje -] = spa [es-ES] Español (España). ' ------------- ' [- Fecha de creación -] = 2023-09-16T08:20:01. ' [- Último acceso -] = 2023-09-16T14:07:28. ' [- Última modificación -] = 2023-09-16T14:05:52. ' ------------- ' [- Net Framework Release -] = Release: 4.6.1 o posterior. ' [- Net Framework Version -] = Versión: 4.0.30319.42000. ' [- Generador nombre -] = H_DocumentadorClases2022. ' [- Generador Version -] = Versión: 1.2.3.4. ' --------------------------------------------- ' [- (C) Propiedad intelectual -] ' --------------------------------------------- ' [- Autor Nombre -] = Joaquin Medina Serrano. ' [- Autor CorreoE -] = gmjms32@gmail.com. ' [- Autor Copyright -] = ' Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivar 4.0 Internacional. ' Se puede consultar una copia de la licencia http://creativecommons.org/licenses/by-nc-nd/4.0/. ' --------------------------------------------- ' [- /Eof -] ' */ Option Explicit On Option Strict On Option Infer Off Option Compare Binary ''' <summary> ''' Clase VO que se usa para mover información desde el Task asíncrono ''' al formulario principal durante el informe de progreso. ''' </summary> ''' <remarks> ''' <abstract> ''' <para> Recibe, (a través del constructor) el numero de segundos que faltan ''' para que termine el proceso y calcula en formato texto y ''' formateado como tiempo, el tiempo que falta para que termine ''' </para> ''' <para> Ejemplo recibe 200 segundos y devuelve la cadena "03:20" </para> ''' <para> Esta clase forma parte de un proyecto de prueba para estudiar ''' como se puede actualizar un control [ProgressBar] desde un Hilo ''' usando las clases [Task] y [Progress] (Informes de progreso) ''' </para> ''' </abstract> ''' <example> ''' Un Ejemplo con la forma de uso de la clase ''' <code> ''' <![CDATA[ ''' ' informe de progreso ''' For i = 0 to 100 ''' If progress IsNot Nothing Then ''' Dim objDatosVO As New DatosDevueltos(i) ''' progress.Report(objDatosVO) ''' End If ''' Next ''' -- ''' Para el informe de progreso. ''' Dim progress As New Progress(Of DatosDevueltos) ''' (Sub(ByVal paramObjDatosVO As DatosDevueltos) ''' pbStatus.Value = paramObjDatosVO.NumeroDeSegundos ''' TextBoxCronometro.Text = paramObjDatosVO.TextoTiempoRestante ''' End Sub) ''' ]]> ''' </code> ''' </example> ''' <fechaCreacion> ''' 2023-09-16T08:20:01 ''' </fechaCreacion> ''' </remarks> Public Class DatosDevueltos ''' <summary> ''' Representa el numero de segundo que faltan para que acabe el proceso ''' Este valor se pasara a la propiedad [value] del control [ProgressBar] del formulario principal ''' </summary> Public ReadOnly Property NumeroDeSegundos As Integer ''' <summary> ''' Representa una cadena formateada como un instante de tiempo por ejemplo "03:20" [3 minutos y 20 segundos] ''' este valor se representara en un TextBox en el formulario principal ''' </summary> ''' <returns></returns> Public ReadOnly Property TextoTiempoRestante As String ''' <summary> ''' Constructor ''' </summary> ''' <param name = "paramNumeroDeSegundos">Numero de segundo que faltan para que acabe el proceso</param> Public Sub New(ByVal paramNumeroDeSegundos As Integer) NumeroDeSegundos = paramNumeroDeSegundos TextoTiempoRestante = CalculoTextoCronometro(paramNumeroDeSegundos) End Sub ''' <summary> ''' Esta función recibe un numero de segundos (en formato integer) ''' y devuelve una cadena formateada con los minutos y ''' segundos correspondientes ''' </summary> ''' <param name = "paramduracionSegundos"></param> ''' <returns> ''' Una cadena formateada como un instante de tiempo ''' por ejemplo "03:20" [3 minutos y 20 segundos] </returns> ''' <remarks> ''' Esta función recibe un numero de segundos (en formato integer) y ''' devuelve una cadena formateada con los minutos y segundos correspondientes ''' Por ejemplo recibe 200 segundos y devuelve la cadena "03:20" ''' Es decir 200 segundos son 3 minutos y 20 segundos ''' Esta cadena se emplea como texto dentro del ProgressBar ''' -- ''' La función esta escrita como un Task para hacer un experimento y ver como funciona Task ''' no es necesario escribirla así, solo tiene que convertir un numero en una cadena formateada ''' </remarks> Private Shared Function CalculoTextoCronometro(ByVal paramduracionSegundos As Integer) As String Dim t1 As Task(Of String) = Task.Run(Function() Dim horas As Integer = 0I Dim minutos As Integer = 0I Dim segundos As Integer = 0I Const segundosDeUnaHora As Integer = 36000I '(3600 = 60x60) Const segundosDeUnMinuto As Integer = 60I Dim localDuracionSegundos As Integer = paramduracionSegundos Do While localDuracionSegundos > = segundosDeUnaHora '(3600 = 60x60) horas + = 1 localDuracionSegundos - = segundosDeUnaHora '(3600 = 60x60) Loop Do While localDuracionSegundos > = segundosDeUnMinuto ' 60I minutos + = 1 localDuracionSegundos - = segundosDeUnMinuto ' 60I Loop segundos = localDuracionSegundos Dim cadenaFormateada As String If horas > 0 Then cadenaFormateada = String.Format("{0:00}:{1:00}:{2:00}", horas, minutos, segundos) Else cadenaFormateada = String.Format("{0:00}:{1:00}", minutos, segundos) End If Return cadenaFormateada End Function) Return t1.Result End Function End Class