当datagridview在c#中加载数据时,UI无响应

时间:2016-03-18 07:22:07

标签: c# datagridview listbox backgroundworker

我在winforms中有一个listbox,datagridview和textbox。

这是我想要做的事情

当用户选择列表框中的项目时,datagridview会加载一些与所选项目有关的数据,并且还有一个自动完成文本框,其自定义源会根据所选项目动态更改。

datagridview和autocomplete文本框的数据源来自rdbms(MYSQL)。

private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
    string item=listBox1.SelectedValue.Tostring();
    UpdateDataGridView(item);
    UpdateACTextBox(item);
}

在此操作完成之前,用户无法在列表框中选择其他项目,只需10秒即可完成。

为了解决这个问题,我遇到了一些像异步方法这样的解决方案。

解决此问题的最佳方法是什么?

BackgroundWorker的, 异步和等待, 线程池, 多线程。

如果我没有正确研究,请提出建议。

开发人员遵循这些类型问题的传统方式是什么?

更新

我忘了提到我正在使用VS2010。由于vs2010不支持async和await。我想我需要放弃这个选项。

提前致谢

1 个答案:

答案 0 :(得分:0)

在我看来,问题是你加载到listView的数据量很大。所以我建议将后台任务与listView的VirtualMode结合使用。在虚拟模式下,数据不会存储在listView中,您必须将值存储在自己的列表中。如果需要,listView将调用一个事件来询问您的值。如果数据不可用,只需返回一个虚拟或使用旧值。这将使listview简单地显示或显示旧值。在列表中复制完值后,只需使用原子操作交换列表的指针(变量)。从那时起,新数据用于更新列表而不是旧数据。调用更新功能以加载新的值。这种方法允许它,虽然在后台更新数据并不时更新它。唯一的缺点是您需要两次存储列表的值。在旧的显示缓冲区内和新的当前更新的缓冲区内。我希望有所帮助。