如何在从数据库 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_word
和 lab_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);
}
}
}
}
}
也可以使用OleDbConnection
、OleDbCommand
和OleDbReader
的异步方法
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);
}
}
}
}
}
我试图从 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_word
和 lab_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);
}
}
}
}
}
也可以使用OleDbConnection
、OleDbCommand
和OleDbReader
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);
}
}
}
}
}