Winforms异步加载大数据?

我刚收到几年前开发的旧应用程序的错误列表,我需要解决的一件事是将数据加载到一个屏幕所需的时间,当然,屏幕被冻结,不幸的是这是在WinForms .NET 4.5中。 数据被加载到WinForms DataGridView中。 我想知道是否有任何方法使用C#5 async加载此数据并等待,同时刷新网格以添加下一组数据。 它可能是在滚动或在后台。任何想法?

尝试从异步线程将所有数据加载到数组中,然后使用Invoke将数组插入DataGridView。

从Form_Load中调用它

new Thread(new ThreadStart(Run)).Start(); 

然后创建此方法

 private void Run() { //DataArray //Load Everything into the DataArray Invoke(new EventHandler(delegate(object sender, EventArgs e) { //Load DataArray into DataGridView }), new object[2] { this, null }); } 

我认为这是将某些内容加载到Control中的最优化方法,因为不允许在MainThread之外触摸控件。 我不知道为什么微软会强制执行此操作,但他们会这样做。 可能有一种方法可以使用Reflection修改MainThread外部的Controls。

您还可以将数据缓慢加载到DataGridView中。 加载所有数据需要更长时间,但它允许您在加载时继续使用表单。

 private void Run() { //DataArray //Load Everything into the DataArray for(/*Everything in the DataArray*/) { Invoke(new EventHandler(delegate(object sender, EventArgs e) { //Load 1 item from DataArray into DataGridView }), new object[2] { this, null }); Thread.Sleep(1); //This number may have to be tweeked } } 

您想使用虚拟模式 。 其他解决方案完成所有前期工作以加载数据然后将其放入网格(这仍然会给你一个启动延迟),否则他们一次添加数据块(这会弄乱你的滚动)。

虚拟模式颠倒了这一点; 而不是你在网格上抛出数据,虚拟模式将让网格请求你的数据。