我有这个函数调用函数:
private void liguaneaRxToolStripMenuItem_Click(object sender, EventArgs e)
{
FillLiguanea();
}
这是它调用的函数:
private void FillLiguanea()
{
this.liguanea_LaneTableAdapter1.Fill(this.pharmaciesDataSet1.Liguanea_Lane);
try
{
string connectionString = "Data Source=LPMSW09000012JD\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
string query = "SELECT * FROM dbo.Liguanea_Lane2";
SqlCommand cmd = new SqlCommand(query, con);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string scode = dr.GetString(dr.GetOrdinal("code"));
comboBox2.Items.Add(scode);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
从SQL数据库中读取超过5000个数据,但是每次读取之前的20秒延迟将不能让最终用户满意。
我的问题是为什么会发生这种情况,有没有办法加快速度?
您应该考虑一些注意事项,使表单在不冻结的情况下运行。
-
你应该在另一个线程中加载数据。您可以创建
Thread
,或使用BackgroundWorker
或使用async/await
模式,如这篇文章。 -
您正在使用
listBox.Items.Add()
逐个添加项目到ListBox
。如果您想这样做,至少应该在添加循环之前调用listBox.BeginUpdate()
,并在循环之后调用listBox.EndUpdate()
。它对您的UI产生了令人印象深刻的影响。更多信息请看这篇文章。您可以呼叫AddRange
或设置DataSource
。
public async Task<DataTable> GetDataAsync()
{
var dt = new DataTable();
var cn = @"Your Connection String";
var cmd = @"SELECT Field1 FROM Table1";
var da = new SqlDataAdapter(cmd, cn);
await Task.Run(() => { da.Fill(dt); });
return dt;
}
private async void Form1_Load(object sender, EventArgs e)
{
var data = await GetDataAsync();
this.ListBox1.DataSource = data;
this.ListBox1.DisplayMember= "Field1";
}