如何在后台运行数据库功能?

时间:2017-11-24 15:16:19

标签: c# winforms async-await

我正在使用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()函数在后台运行而无需用户等待它完成。怎么做?

2 个答案:

答案 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)

您可以使用一个相当简单的示例来实现asyncawait。但是,该代码将允许您的应用程序工作并释放一个线程,以避免锁定您的用户界面或其他方面。

但是,代码确实存在缺陷,或者在某些情况下可能没有任何好处。因此,明智地使用异步功能。但是,您应该知道,即使释放您的应用程序并可能创建单独的线程来访问您的数据库,SQL Server也会按照配置的方式确定优先级并执行所述操作。

如果您有大量数据库流量,那么您的应用程序所执行的某些操作可能会受到阻碍。所以请记住这一点。 SQL将为请求提供线程,以确保它如何确保数据完整性。