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

C# 如何在后台运行数据库功能?,c#,winforms,async-await,C#,Winforms,Async Await,我正在处理C#windows窗体,遇到了这个问题 我有两个表单,在第一个表单中,用户输入用户名并按下按钮。按钮调用在数据库中保存用户名的函数 private void btn_Click(object sender, EventArgs e) { Database db = new Database(); db.SaveUsername(txtUsername.Text); new Form2().Show(); } 这个SaveUsername()函数位于单独的类中

我正在处理C#windows窗体,遇到了这个问题

我有两个表单,在第一个表单中,用户输入用户名并按下按钮。按钮调用在数据库中保存用户名的函数

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
    }
}

我的问题是,当用户点击enter键时,打开
Form2
需要一些时间,因此我希望新表单应该出现,并且
SaveUsername()
函数在后台运行,而不需要用户等待它完成。它是如何完成的?

更改方法签名并使用异步方法,如:

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();
}

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

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


因此,如果数据库流量较大,应用程序执行的某些操作可能会受到阻碍。所以请记住这一点。SQL将以其认为可以确保数据完整性的方式对请求执行线程处理。

您听说过
Async
方法吗?嘿!不,我在学C。新手it@Allen您可能还想了解如何为第二个表单的构造函数重载另一个表单的方法,以及在创建第二个表单的实例时传递给另一个表单的内容,除了异步方法之外,对于简单的插入,仅为用户/密码写入数据库是没有意义的。了解和了解更多关于您当前架构的信息也会有所帮助。请您回答。我可以问一下
await
在这种情况下做什么吗?以及
await db.SaveAsync()是怎样做的将在
保存用户名
功能中提供帮助
db.
对象不在函数中long stroy short它
不会阻塞它正在执行的线程并继续执行方法的其余部分
,了解更多关于wait的信息这不是批评而是怀疑我自己,希望你能解释:为什么选择使所有东西都异步(buton事件)在使用诸如:
new-Thread(db.SaveUsername)
@Alen这样的行之前,每个带有
wait
的方法在公共/私有和返回值之间应该有
async
,并且返回值应该是
void
Task
Task