【问题标题】:Main form freezing due to backgroundwork由于后台工作导致主窗体冻结
【发布时间】:2014-10-09 20:03:48
【问题描述】:

场景:我正在制作一个登录表单,它连接到 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(),否则else 部分应该。

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

任何帮助将不胜感激。非常感谢!

【问题讨论】:

    标签: vb.net multithreading backgroundworker


    【解决方案1】:

    您在后台工作人员中做的第一件事就是将所有工作强制返回给 UI 线程。这就是它挂起你的 UI 的原因。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多