Forzar la clase VB.NET multiproceso para mostrar resultados en un solo formulario

Tengo una aplicación de formulario de Windows que utiliza una clase compartida para albergar todos los objetos comunes para la aplicación. La clase de configuración tiene una colección de objetos que hacen cosas periódicamente, y luego hay algo de interés, necesitan alertar al formulario principal y actualizarlo.

Actualmente estoy haciendo esto a través de Eventos en los objetos, y cuando se crea cada objeto, agrego un EventHandler para asignar el evento nuevamente al formulario. Sin embargo, me encuentro con algunos problemas que sugieren que estas solicitudes no siempre terminan en la copia principal de mi formulario. Por ejemplo, mi formulario tiene un ícono de bandeja de notificación, pero cuando el formulario captura un evento e intenta mostrar una burbuja, no aparece ninguna burbuja. Sin embargo, si modifico ese código para hacer que el ícono sea visible (aunque ya lo es), y luego muestre la burbuja, aparecerá un segundo ícono que mostrará la burbuja correctamente.

¿Alguien se ha encontrado con esto antes? ¿Hay alguna manera de forzar que todos mis eventos sean capturados por la única instancia del formulario, o hay una forma completamente diferente de manejar esto? Puedo publicar muestras de código si es necesario, pero creo que es un problema común de subprocesos.

MÁS INFORMACIÓN: Actualmente estoy usando Me.InvokeRequired en el controlador de eventos en mi formulario, y siempre devuelve FALSE en este caso. Además, el segundo ícono de la bandeja creado cuando lo hago visible desde este formulario no tiene un menú contextual, mientras que el ícono "real" sí, ¿eso tiene alguna pista?

¡Me voy a sacar el pelo! ¡Esto no puede ser tan difícil!

SOLUCIÓN: Gracias a nobugz por la pista, y me llevó al código que estoy usando ahora (que funciona muy bien, aunque no puedo evitar pensar que hay una mejor manera de hacerlo). Agregué una variable booleana privada al formulario llamado "IsPrimary", y agregué el siguiente código al constructor del formulario:

    Public Sub New()
        If My.Application.OpenForms(0).Equals(Me) Then
            Me.IsFirstForm = True
        End If
    End Sub

Una vez que esta variable se establece y el constructor termina, se dirige directamente al controlador de eventos, y lo trato de esta manera (CAVEAT: Dado que el formulario que estoy buscando es el formulario principal para la aplicación, My.Application.OpenForms ( 0) obtiene lo que necesito. Si estaba buscando la primera instancia de un formulario que no es de inicio, tendría que repetirlo hasta que lo encuentre):

    Public Sub EventHandler()
        If Not IsFirstForm Then
            Dim f As Form1 = My.Application.OpenForms(0)
            f.EventHandler()
            Me.Close()
        ElseIf InvokeRequired Then
            Me.Invoke(New HandlerDelegate(AddressOf EventHandler))
        Else
            ' Do your event handling code '
        End If
    End Sub

Primero, verifica si se está ejecutando en el formulario correcto; si no lo está, llame al formulario correcto. Luego verifica si el hilo es correcto y llama al hilo de la interfaz de usuario si no lo es. Luego ejecuta el código del evento. No me gusta que sean potencialmente tres llamadas, pero no puedo pensar en otra forma de hacerlo. Parece funcionar bien, aunque es un poco engorroso. Si alguien tiene una mejor manera de hacerlo, ¡me encantaría escucharlo!

Nuevamente, gracias por toda la ayuda, ¡esto me volvería loco!

Respuestas a la pregunta(4)

Su respuesta a la pregunta