2010-08-24 4 views
2

J'ai un petit formulaire qui notifie l'utilisateur à la fin des événements (tels que la restauration SMO). Je souhaite que ce formulaire apparaisse à partir de diverses sources (tel que l'événement SMO Restore complete ci-dessous), donc je suppose que je dois créer un nouveau thread avant de créer le formulaire? Comme il pourrait être appelé de l'extérieur du fil de l'interface utilisateur. (J'ai aussi besoin de passer une chaîne à ce formulaire)Création d'un formulaire dans un nouveau thread (à partir d'un événement)

La forme enfant se fane en utilisant une minuterie + Opacité.

Qu'est-ce que je fais mal ici?

Private Sub CompleteEventHandler(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Common.ServerMessageEventArgs) 
    MyThread = New System.Threading.Thread(AddressOf DoStuff) 
    MyThread.Start("meh") 
End Sub 


Private Delegate Sub DoStuffDelegate(ByVal MsgString As String) 
Private Sub DoStuff(ByVal MsgString As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New DoStuffDelegate(AddressOf DoStuff)) 
    Else 
     Dim TempMessage As New frmNotification 
     TempMessage.lblMessage.Text = MsgString 
     TempMessage.Show() 
    End If 
End Sub 

Répondre

1

Ne pas commencer un nouveau fil, il n'y a pas de point puisque vous êtes déjà en cours d'exécution sur un autre fil et InvokeRequired sera toujours vraie. L'erreur est que vous appelez Me.Invoke() mais oubliez de passer l'argument "MsgString". Vous voudrez aussi utiliser Me.BeginInvoke(), pas besoin d'attendre. Ainsi:

Private Sub CompleteEventHandler(ByVal sender As Object, ByVal e As EventArgs) 
    Me.BeginInvoke(New DoStuffDelegate(AddressOf DoStuff), "meh") 
End Sub 

Private Sub DoStuff(ByVal MsgString As String) 
    Dim TempMessage As New frmNotification 
    TempMessage.lblMessage.Text = MsgString 
    TempMessage.Show() 
End Sub 
+0

Merci Hans, aide précieuse. – madlan

Questions connexes