vea el programa a continuación. Comienzo un nuevo hilo x con la función abc, luego hago una tarea más larga. ¿Por qué x solo comienza después del extremo sub? ¿No debería comenzar enseguida, antes de dormir?¿Por qué mi hilo no está comenzando de inmediato?
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As New Threading.Thread(AddressOf abc)
x.SetApartmentState(Threading.ApartmentState.MTA)
x.Start()
System.Threading.Thread.Sleep(5000)
End Sub
Sub abc()
For i As Integer = 0 To 10 Step 1
Me.lblStatus.Text = "Testing DB connection (timeout in: " + i.ToString() + "s)"
'Me.StatusStrip1.Invoke(
MsgBox(i.ToString)
System.Threading.Thread.Sleep(1000)
Next
End Sub
Editar:
La solución es la siguiente:
(A) Poner tanto los intentos de conexión y la cuenta atrás de tiempo de espera en hilos separados.
(B) Actualización de la interfaz de usuario de la siguiente manera:
If Me.InvokeRequired Then
Me.Invoke(pUpdateStatusMessage, "Successfully connected.")
Else
UpdateStatusMessage("Successfully connected.")
End If
Con esta declarada a nivel mundial, por lo que ningún argumento para aprobar es necesario:
Delegate Sub t_pUpdateStatusText(ByVal strMessage As String)
Public pUpdateStatusMessage As t_pUpdateStatusText = New t_pUpdateStatusText(AddressOf UpdateStatusMessage)
Public Sub UpdateStatusMessage(ByVal strMessage As String)
Me.lblStatus.Text = strMessage
Me.StatusStrip1.Update()
End Sub
¿Cómo se verifica que el hilo solo se inicia una vez que finaliza el método? ¿Estás mirando la etiqueta, o estás esperando que se dispare un punto de interrupción? –
En realidad, cuando no se muestra, configuro un punto de interrupción. –