【问题标题】:Loading Data Table on form load, how to speed it up in c#在表单加载时加载数据表,如何在 c# 中加快速度
【发布时间】:2011-10-11 14:41:13
【问题描述】:

我有 c# windows 窗体,当它打开时它会加载数千条记录来填充数据表,问题是当我单击窗体时,它会在显示所有数据之前显示一段时间的空白窗口,所以

如何在数据加载时在 datagridview 上显示等待标志并让表单的其他控件可见?

如果它完成了工作,我该如何加快它的速度。我准备好进行线程化了。

【问题讨论】:

  • 是否可以选择使用 jQuery?您可以使用 jQuery 完成所有这些操作(表和加载器图像的异步加载)。你想在页面上显示多少行,如果你只想要一个选择,你可以使用 pageddatasource
  • @Ivo,它是 winforms,而不是 html/web - 所以没有 jQuery。
  • @Ivo: see
  • 很抱歉在我的“自己”的世界里太多了,但我认为 pagedatasource 仍然是一个选项
  • 您是否对 DataGridView 进行任何格式化?通常从后端获取数千条记录应该在不到一秒的时间内完成。

标签: c# .net database winforms .net-3.5


【解决方案1】:

你完全可以使用线程。它基本上包括启动另一个线程来查询数据库,同时向用户显示一些加载消息。

这里有一些文档:

MSDN Thread Class

还有一些代码示例:

Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();

ThreadProc 应该是您的数据加载方法。

让我再澄清一点:

您的数据加载方法应该只查询数据库并将返回值提供给主线程,正如 cmets 中所指出的,您不能与来自另一个线程的 UI 元素进行交互。

【讨论】:

  • 如果您要更新表单上的控件,请注意,您需要调用,您的线程无法与您的 UI 线程对话
  • @Hammerstein 很好的指点,我已经编辑了答案以包含它。
【解决方案2】:

您需要一个后台线程。您可以在表单中设置一个 BackgroundWorker,或者在您的事件处理程序中设置一个带有 BeginInvoke 的基本异步模型,完成后将提供另一个方法作为其回调。在后台工作人员中,执行所有数据检索,然后在需要实际填充 DGV 时调用回主线程(一旦信息全部在内存中,这将花费更少的时间)。

问题在于,当主线程忙于等待数据库返回所有行时,系统无法响应任何其他用户输入或 Windows 消息(例如“重绘自己”)。 Windows 将看到该应用程序的消息队列正在备份并将该应用程序标记为“无响应”。不是很愉快的用户体验。

【讨论】:

    【解决方案3】:

    您应该必须使用BackgroundWorker 类。

    【讨论】:

      【解决方案4】:

      使用后台工作者组件。它比自己的线程更容易处理 或者,您可以使用 ado.net 提供的异步方法,例如 beginexecutereader 等

      【讨论】:

        【解决方案5】:

        您可以将asynchronous queries 与部分结果结合使用。

        如果您的数据库系统不支持 MySQL 中常见的 LIMIT 子句来指定部分结果,您可以使用类似this 的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-16
          • 2015-06-01
          相关资源
          最近更新 更多