在新线程中创建表单(来自事件)

时间:2010-08-24 19:15:02

标签: vb.net

我有一个小表单,通知用户完成事件(例如SMO恢复)。

我希望这个表单能够从各种来源出现(例如下面的SMO Restore complete事件),所以我想在创建表单之前需要创建一个新的线程?因为它可以从UI线程外部调用。 (我还需要将字符串传递给此表单)

子表单使用计时器+不透明度淡出。

我在这里做错了什么?

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

1 个答案:

答案 0 :(得分:1)

不要启动新线程,没有意义,因为你已经在另一个线程上运行,而InvokeRequired将始终为True。错误是您调用Me.Invoke()但忘记传递“MsgString”参数。你也想要使用Me.BeginInvoke(),无需等待。因此:

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