由于背景工作导致主要形式冻结

时间:2014-06-02 18:52:14

标签: vb.net multithreading backgroundworker

场景:我正在创建一个登录表单,该表单连接到MySQL数据库以进行帐户和密码确认。

尝试:我试图在表单连接并从数据库中获取结果时显示动画加载gif和加载文本。

到目前为止:所以我使用后台工作者: 登录按钮:

Private Sub LoginBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoginBtn.Click
    PictureBox2.Visible = True
    Label6.Visible = True
    BackgroundWorker1.RunWorkerAsync()
End Sub

后台工作人员DoWork:

 Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    AccessControl()
End Sub


Private Sub AccessControl()
    If Me.InvokeRequired Then
        Me.Invoke(New MethodInvoker(AddressOf AccessControl))
    Else
        con.Open()
        Dim user, pass As String
        user = UserNameBox.Text
        pass = Crypt(PasswordBox.Text)
        cmd = New MySqlCommand("SELECT * FROM users WHERE Name ='" + user + "' And Password ='" + pass + "'", con)
        dr = cmd.ExecuteReader
    End If
End Sub

后台RunWorkerCompleted:

 Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If (dr.Read()) Then
        FadingForm()

    Else
        PictureBox2.Visible = False
        Label6.Visible = False
        WrnPnl.Visible = True
        WrnLbl.Visible = True
        WrnPnlImg.Visible = True
        PasswordBox.Text = ""
        UserNameBox.Text = ""
        UserNameBox.Focus()
    End If

    con.Close()
End Sub

应该发生什么:当用户点击登录按钮输入凭据后,应该出现动画加载gif和加载文本,后台进程应该开始,如果凭据是正确的,应该触发FadingForm(),否则其他部分应该。

问题:问题是当我输入相关凭据后按下“登录”按钮时,加载的gif和文本会显示,但表单会冻结。在完成该过程后,主表单恢复正常。我确信表格冻结,因为动画GIF停止动画,非控件可用。我不知道可能的原因是什么或如何修复。

任何帮助将不胜感激。万分感谢!

1 个答案:

答案 0 :(得分:2)

你在后台工作者中做的第一件事就是将所有工作强制回UI线程。这就是它挂起你的用户界面的原因。

If Me.InvokeRequired Then
    Me.Invoke(New MethodInvoker(AddressOf AccessControl))

您应该只调用对UI的访问,而不是sql工作。由于您需要访问用户名和密码字段,因此应将它们作为参数传递,或者在后台工作程序开始之前将它们从控件中移出并放入本地变量中。这样,您无需调用任何内容即可访问其值。

声明用户并在表单级别传递,并在click事件中执行此操作。

    user = UserNameBox.Text
    pass = Crypt(PasswordBox.Text)