我正在使用C#windows窗体并遇到过这个问题
我有两种形式,在第一种形式用户输入用户名并按下按钮。 Button调用一个在数据库中保存用户名的函数。
private void btn_Click(object sender, EventArgs e)
{
Database db = new Database();
db.SaveUsername(txtUsername.Text);
new Form2().Show();
}
并且此SaveUsername()
函数位于单独的类
class Database
{
public void SaveUsername(string username)
{
Connect(); //Connection to database
//Some lines to save username in database
}
}
我的问题是当用户点击输入时需要一点时间才能打开Form2
所以我希望新的表单出现并且SaveUsername()
函数在后台运行而无需用户等待它完成。怎么做?
答案 0 :(得分:5)
更改您的方法签名并使用Async方法,如:
private async void btn_Click(object sender, EventArgs e)
{
Database db = new Database();
await db.SaveUsernameAsync(txtUsername.Text);
new Form2().Show();
}
class Database
{
public async Task SaveUsername(string username)
{
Connect(); //Connection to database
//Some lines to save username in database
....
await db.SaveAsync();
}
}
或将用户保存在新主题中:
private async void btn_Click(object sender, EventArgs e)
{
Database db = new Database();
await Task.Run(() => SaveUsername(txtUsername.Text));
new Form2().Show();
}
答案 1 :(得分:3)
您可以使用一个相当简单的示例来实现async
和await
。但是,该代码将允许您的应用程序工作并释放一个线程,以避免锁定您的用户界面或其他方面。
但是,代码确实存在缺陷,或者在某些情况下可能没有任何好处。因此,明智地使用异步功能。但是,您应该知道,即使释放您的应用程序并可能创建单独的线程来访问您的数据库,SQL Server也会按照配置的方式确定优先级并执行所述操作。
如果您有大量数据库流量,那么您的应用程序所执行的某些操作可能会受到阻碍。所以请记住这一点。 SQL将为请求提供线程,以确保它如何确保数据完整性。