6

He estado tratando de entender esto por unos días y me pregunto si es algo simple que me falta o que estoy haciendo completamente mal.VB.NET Multithreading. Invocar invocación en un control de UI desde una clase en un archivo de clase separado

Ejemplo: dos archivos - TestClass.vb, myForm.vb


TestClass.vb se ve de la siguiente manera:

Imports System.Threading 

Public Class TestClass 
    Private myClassThread As New Thread(AddressOf StartMyClassThread) 

    Public Sub Start() 
     myClassThread.Start() 
    End Sub 

    Private Sub StartMyClassThread() 
     myForm.Msg("Testing Message") 
    End Sub 
End Class 

myForm.vb es una forma básica con una control de cuadro de lista y un botón de control con el nombre respectivamente Output y StartButton. El código detrás de la forma es la siguiente:

Public Class myForm 
    Private classEntity As New TestClass 

    Private Sub StartButton_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) _ 
           Handles StartButton.Click 
     Msg("Start Button Pressed") 
     classEntity.Start() 
    End Sub 

    Delegate Sub MsgCallBack(ByVal mesg As String) 

    Public Sub Msg(ByVal mesg As String) 
     If Output.InvokeRequired Then 
      MsgBox("Invoked") 
      Dim d As New MsgCallBack(AddressOf Msg) 
      Invoke(d, New Object() {mesg}) 
     Else 
      MsgBox("Not Invoked") 
      mesg.Trim() 
      Output.Items.Add(mesg) 
     End If 
    End Sub 
End Class 

El resultado:

ejecuta la aplicación, no hay errores o excepciones. que se muestra es el cuadro de lista y el botón Inicio. Presiono el botón de inicio y un msgbox dice "No invocado" como se esperaba y al hacer clic en Aceptar para ese msgbox se agrega "Botón de inicio presionado" al control de cuadro de lista de Salida. Inmediatamente después de que el msgbox aparece de nuevo y dice "No invocado". Esperaba "invocado" ya que un hilo separado está tratando de usar el control de cuadro de lista de salida. Por supuesto, esto da como resultado que se intente Output.Items.Add, lo que no da como resultado resultados visibles, ya que el hilo no puede actualizar directamente el control de la IU.

Debo haber leído un libro pequeño con diferentes páginas tratando de entender completamente las caídas y los métodos, pero creo que puedo haber caído en una trampa que muchas personas pueden hacer. Con mi comprensión y conocimiento actuales, no puedo salir de esa trampa y agradecería cualquier aporte o consejo.

Saludos cordiales,

Lex

Respuesta

3

El problema aquí es que está llamando la función Msg no en una instancia de myForm, sino como una función compartida de la myForm clase.

cambiar su código en TestClass añadir

Public FormInstance as myForm 

y luego vuelva a colocar

myForm.Msg("Testing Message") 

con

FormInstance.Msg("Testing Message") 

Luego, en StartButton_Click añadir la línea

classEntity.FormInstance = Me 

y obtendrá el resultado esperado.

+0

Soumya92 - ¡Perfecto! Muchas gracias. Voy a 'votar' tan pronto como lo permita la reputación. – Lecronox

Cuestiones relacionadas