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

Ale*_*len 0 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();
}
Run Code Online (Sandbox Code Playgroud)

这个SaveUsername()函数是在单独的类中

class Database
{
    public void SaveUsername(string username)
    {
        Connect(); //Connection to database
        //Some lines to save username in database
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是当用户点击进入它需要一点时间打开Form2所以我希望新的表单应该出现并且SaveUsername()功能在后台运行而无需用户等待它完成.怎么做?

esi*_*mer 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者将用户保存在新线程中:

private async void btn_Click(object sender, EventArgs e)
{
    Database db = new Database();
    await Task.Run(() => SaveUsername(txtUsername.Text));    
    new Form2().Show();
}
Run Code Online (Sandbox Code Playgroud)

  • @Alen,每个带有`await`的方法都应该在public/private和return值之间有`async`,返回值也应该是`void`,`Task`或`Task <returnType>` (2认同)