在Windows窗体应用程序中异步填充datagridview

时间:2009-08-31 13:26:01

标签: winforms datagridview asynchronous

howzit!

我是最近被要求开发Windows表单应用程序的Web开发人员,所以如果我的问题有点基本的话,请耐心(或者不要笑!)。

在与我的客户进行多次会话之后,我们最终确定了一个包含带有5个选项卡的tabcontrol的界面。每个标签都有一个数据网格视图, 可能 最终最多可容纳25,000行数据(每行约6列)。我已成功设法在加载标签页时绑定网格,并且它可以正常处理几条记录,但是当我用20,000个虚拟记录绑定网格时,UI会冻结。当我单击选项卡本身时会发生“冻结”,并且只有在绑定完成后,UI才会释放(并且会显示标签页)。

我把这个传达给了客户,并提到了每个网格的分页选项,但她是w.r.t.不想要这个。我唯一的选择是在后台寻找一些异步方法。我对Windows窗体中的线程知之甚少,但我知道我可以使用BackgroundWorker控件来实现这一点。在阅读之后我唯一的问题是它理想地用于“长时间运行”的任务和I / O操作。

我的问题:

  1. 如何确定长时间运行的任务?
  2. 如何不滥用BackgroundWorker控件,即。使用它时是否有一般指导原则? (我知道在某些情况下打开/生成多个线程可能是不受欢迎的)
  3. 最重要的是:如何在 选项卡页面及其所有子控件加载后,实现(异步)绑定datagridview
  4. 感谢您阅读此( ahem )冗长的查询,我非常感谢您对此事的任何回复/想法/方向!

    干杯!

1 个答案:

答案 0 :(得分:1)

  1. 确定长时间运行的任务没有硬性规定。作为开发人员,您必须了解这一点。您必须了解数据和架构的性质。例如,如果您希望从包含几十行的表中的单个用户从桌面数据库中获取某些信息,您甚至可能不会显示等待光标。但是,如果您通过网络将数百行数据提取到共享数据库服务器,那么您最好期望它可能是一个长期运行的任务,不仅仅是使用等待游标而是一个释放的线程来处理在获取期间的UI。 (你肯定在这里正确的方向。)

  2. BackgroundWorker是一种快速而肮脏的方式来处理表单中的线程。在您的情况下,它将把数据提取与用户界面联系起来。它是可行的,工作正常但当然不被认为是线程,OOP,关注点分离等的“最佳实践”。如果你担心滥用线程的位置,你可能想要阅读ThreadPool

  3. Here's一个使用线程池的异步线程的好例子。要进行数据绑定,您需要在线程中获取数据,并在获得回调时,只需将结果集分配给网格视图的数据源属性。