【问题标题】:UI is not responsive when datagridview loading data in c#当datagridview在c#中加载数据时UI没有响应
【发布时间】:2016-03-18 07:22:07
【问题描述】:

我在 winforms 中有一个列表框、datagridview 和文本框。

这就是我想要做的事情

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

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

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

在此操作完成之前,用户无法选择列表框中的其他项目,大约需要 10 秒才能完成。

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

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

后台工作人员, 异步和等待, 线程池, 多线程。

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

开发人员解决这类问题的常规方法是什么?

更新:

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

提前致谢

【问题讨论】:

  • 这取决于你在哪里有更多的经验。我通常使用 async/awayt 并调用仅返回数据的方法,不要在这些方法中调用任何 UI 属性。之后,一切都绑定到 UI 元素。
  • @Eugen 是否可以在返回数据表的方法中使用 async/await?因为我读到 async/await 应该只用于 void 方法,Task
  • @CSTRAIZE,你在哪里读到的? void 返回方法仅用于事件处理程序(如 listBox1_SelectedValueChanged),但其他一切都应返回 Task(或 Task<T>)。
  • @PauloMorgado 是的,我明白了。我还有一个疑问,当用户单击列表框中的项目时,该项目值异步完成 10 秒的工作,同时当用户选择另一个项目和另一个项目时。这是否意味着,工作将完成 10 秒+10 秒,然后 UI 响应。
  • 10 秒在数据库世界中是很长的时间。虽然后台工作人员可能会有所帮助,但您可能在 UpdateDataGridView 或 UpdateACTextBox 方法中做一些根本上很慢的事情。你没有向我们展示。

标签: c# datagridview listbox backgroundworker


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2013-05-07
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多