Winforms异步加载大数据?

时间:2013-07-06 07:04:03

标签: c# .net data-binding devexpress c#-5.0

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

2 个答案:

答案 0 :(得分:6)

尝试从异步线程将所有数据加载到数组中,然后使用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之外的控件。

您还可以将数据缓慢加载到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
    }
}

答案 1 :(得分:3)

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

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