为什么我的程序在选择strip时滞后

时间:2016-11-04 14:20:10

标签: c# sql winforms

我有这个函数调用函数:

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秒滞后将不会令最终用户满意。

我的问题是为什么会发生这种情况并且有办法加快速度吗?

1 个答案:

答案 0 :(得分:2)

你应该考虑一些注意事项,使表格在没有被冻结的情况下运行。

  1. 您应该在另一个线程中加载数据。您可以创建Thread,或使用BackgroundWorker或使用async/awaitListBox模式。

  2. 您正在使用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"; } 。设置数据源将非常有效。

  3. 示例

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