我有这个函数调用函数:
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秒滞后将不会令最终用户满意。
我的问题是为什么会发生这种情况并且有办法加快速度吗?
答案 0 :(得分:2)
你应该考虑一些注意事项,使表格在没有被冻结的情况下运行。
您应该在另一个线程中加载数据。您可以创建Thread
,或使用BackgroundWorker
或使用async/await
等ListBox
模式。
您正在使用listBox.Items.Add()
逐个向listBox.BeginUpdate()
添加项目。如果你想这样做,至少你应该在添加循环之前调用listBox.EndUpdate()
并在循环之后调用AddRange
。它会对您的UI产生深远的影响。有关详细信息,请参阅this post。您可以致电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";
}
。设置数据源将非常有效。
示例强>
onStatsSelect(event, menuItem, index) {
const selectedStatsCopy = this.state.selectedStats.slice();
const itemIndex = selectedStatsCopy.indexOf(menuItem.props.primaryText);
if (itemIndex > -1) {
delete selectedStatsCopy[itemIndex];
} else {
selectedStatsCopy[index] = menuItem.props.primaryText;
}
// Update state
this.setState({ selectedStats: selectedStatsCopy });
// Notify worker window of change
if (!(this.props.isReport)) {
console.log('in renderer main window');
ipcRenderer.send("updateSelectedStatsMain", event, selectedStatsCopy);
}
}