如何在从数据库 C# 读取时延迟我的程序

How to delay my program while reading from a database C#

我试图从 MS Access 数据库中逐行读取并将其显示在屏幕上,但每次显示之间都有几秒钟的休眠,我遇到了麻烦。

如您所见,我正在使用 System.Threading,但似乎睡眠是在程序显示记录之前发生的,当睡眠结束时,只显示最后一条记录而不显示之前的记录。

这是我的代码,非常感谢您的帮助!

private void com_start_Click(object sender, EventArgs e)
{
    try
    {
        string ConString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;";

        OleDbConnection Con = new OleDbConnection(ConString);
        Con.Open();

        check_connection.Text = "succeeded";

        OleDbCommand command = new OleDbCommand();
        command.Connection = Con;
        command.CommandText = "Select * From words";

        OleDbDataReader reader = command.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                lab_word.Text = reader["word"].ToString();
                lab_definition.Text = reader["definition"].ToString();
                Thread.Sleep(30000);
            }
        }

        reader.Close();
        Con.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error " + ex);
    }
}

UI 控件 lab_wordlab_definition.Text 将在整个 com_start_Click 方法完成后更新。
这就是为什么您看到只显示最后一行的原因。

您需要 "release" UI 线程读取每一行 3 秒后更新 UI 控件的新值。

我认为 async/await 方法非常适合这个目的。
使用 async 关键字标记按钮点击。

private async void com_start_Click(object sender, EventArgs e)
{
    string ConString = 
        @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;";
    using (var Con = new OleDbConnection(ConString))
    {
        Con.Open();
        check_connection.Text = "successed";
        using (var command = new OleDbCommand())
        {
            command.Connection = Con;
            command.CommandText = "Select * From words";
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    lab_word.Text = reader["word"].ToString();
                    lab_definition.Text = reader["definition"].ToString();
                    await Task.Delay(30000);
                }
            }
        }
    }
}

也可以使用OleDbConnectionOleDbCommandOleDbReader

的异步方法
private async void com_start_Click(object sender, EventArgs e)
{
    string ConString = 
        @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;";
    using (var Con = new OleDbConnection(ConString))
    {
        await Con.OpenAsync();
        check_connection.Text = "successed";
        using (var command = new OleDbCommand())
        {
            command.Connection = Con;
            command.CommandText = "Select * From words";
            using (var reader = await command.ExecuteReader())
            {
                while (await reader.ReadAsync())
                {
                    lab_word.Text = reader["word"].ToString();
                    lab_definition.Text = reader["definition"].ToString();
                    await Task.Delay(30000);
                }
            }
        }
    }
}