Forçar a classe VB.NET multiencadeada para exibir resultados em um único formulário

Eu tenho um aplicativo de formulário do Windows que usa uma classe compartilhada para abrigar todos os objetos comuns para o aplicativo. A classe de configurações tem uma coleção de objetos que fazem as coisas periodicamente e, em seguida, há algo de interessante: eles precisam alertar o formulário principal e atualizá-lo.

Atualmente, estou fazendo isso através de Eventos nos objetos e, quando cada objeto é criado, adiciono um EventHandler para mapear o evento de volta ao formulário. No entanto, estou com alguns problemas que sugerem que essas solicitações nem sempre terminam na cópia principal do meu formulário. Por exemplo, meu formulário tem um ícone na bandeja de notificação, mas quando o formulário captura e evento e tenta exibir um balão, nenhum balão aparece. No entanto, se eu modificar esse código para tornar o ícone visível (embora já exista) e exibir o balão, um segundo ícone aparecerá e exibirá o balão corretamente.

Alguém já se deparou com isso antes? Existe uma maneira de forçar todos os meus eventos a serem capturados pela instância única do formulário ou existe uma maneira completamente diferente de lidar com isso? Posso postar exemplos de código, se necessário, mas acho que é um problema comum de encadeamento.

MAIS INFORMAÇÕES: Atualmente, estou usando Me.InvokeRequired no manipulador de eventos no meu formulário e, sempre, retorna FALSE nesse caso. Além disso, o segundo ícone da bandeja criado quando o mostro a partir deste formulário não possui um menu de contexto, enquanto o ícone "real" possui - isso indica alguém?

Vou arrancar meu cabelo! Isso não pode ser tão difícil!

SOLUÇÃO: Obrigado a nobugz pela dica, e isso me levou ao código que estou usando agora (que funciona lindamente, embora não possa deixar de pensar que há uma maneira melhor de fazer isso). Adicionei uma variável booleana privada ao formulário chamado "IsPrimary" e adicionei o seguinte código ao construtor de formulários:

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

Depois que essa variável é definida e o construtor é concluído, ele segue direto para o manipulador de eventos, e eu os trato dessa maneira (CAVEAT: Como o formulário que estou procurando é o principal para o aplicativo, My.Application.OpenForms ( 0) obtém o que eu preciso. Se eu estivesse procurando pela primeira instância de um formulário que não fosse de inicialização, teria que percorrer até encontrá-lo):

    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

Primeiro, ele verifica se está sendo executado no formulário correto - se não estiver, chame o formulário correto. Em seguida, verifica se o thread está correto e chama o thread da interface do usuário, se não estiver. Em seguida, ele executa o código do evento. Não gosto que sejam três ligações, mas não consigo pensar em outra maneira de fazer isso. Parece funcionar bem, embora seja um pouco complicado. Se alguém tem uma maneira melhor de fazê-lo, eu adoraria ouvir!

Mais uma vez, obrigado por toda a ajuda - isso estava me deixando louco!

questionAnswers(4)

yourAnswerToTheQuestion