第一!我知道以前也有人问过非常类似的问题,然而,答案是如此具体,以至于我真的不明白如何应用它们。请不要烤我。
我想要的是构建一个相当通用的应用程序,它具有CRUD模块和报告(c#和MySQL),没有什么特别之处。然而,每当我的应用程序运行一行对查询服务器的方法的调用时,UI冻结了几毫秒,UI冻结的感觉非常恼人。
据我所知,每个数据库调用都需要在不同的线程中使用后台工作者或任务来完成,这样主线程就不会变得繁忙,从而使UI没有响应,但每当我尝试这样做时,我都会遇到问题,因为我无法访问UI组件。
你们能以这个简单的登录表单为例来帮助我吗?
我有一个简单的表单、两个文本框、txtUser和txtPassword,以及一个带有以下代码的按钮:
MySqlDataReader? user = MdlUsers.GetUserByUsername(txtUser.Text);
if (user != null && user.Read())
{
string? pwd = user["clave"].ToString();
if (pwd != null && pwd.Equals(txtPassword.Text))
{
MessageBox.Show("Acceso correcto.");
logged = true;
}
else
{
MessageBox.Show("Acceso denegado.");
logged = false;
}
}
else
{
MessageBox.Show("No regresó nada.");
logged = true;
}
以下是MdlUser类的代码:
public class MdlUsers
{
public static MySqlDataReader? GetUserByUsername(string username)
{
MySqlDataReader? result = null;
try
{
string qry = "SELECT * FROM usuarios WHERE login = @username";
MySqlCommand cmd = new MySqlCommand(qry, MdlConnection.Connect());
cmd.Parameters.AddWithValue("@username", username);
result = cmd.ExecuteReader();
return result;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
}
每当我点击该按钮时,用户界面就会卡顿。那我怎么处理这件事呢?非常感谢。
1条答案
按热度按时间hgb9j2n61#
处理这种情况的方法是在单独的任务上执行长时间阻塞操作,当它完成时,POST对GUI线程进行调用。
您还没有告诉我们您使用的是哪种图形用户界面(这就是在Stackoverflow上使用标记的原因),我怀疑它是WinForms,所以在WinForms中使用
Control.BeginInvoke()
可以做到这一点。当您指定要使用
Control.BeginInvoke()
调用的Action
时,该Action
将在GUI线程中运行,因此它将能够安全地“访问UI组件”。