场景:我正在创建一个登录表单,该表单连接到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停止动画,非控件可用。我不知道可能的原因是什么或如何修复。
任何帮助将不胜感激。万分感谢!
答案 0 :(得分:2)
你在后台工作者中做的第一件事就是将所有工作强制回UI线程。这就是它挂起你的用户界面的原因。
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf AccessControl))
您应该只调用对UI的访问,而不是sql工作。由于您需要访问用户名和密码字段,因此应将它们作为参数传递,或者在后台工作程序开始之前将它们从控件中移出并放入本地变量中。这样,您无需调用任何内容即可访问其值。
声明用户并在表单级别传递,并在click事件中执行此操作。
user = UserNameBox.Text
pass = Crypt(PasswordBox.Text)