【问题标题】:Winforms asynchronous loading large data?Winforms异步加载大数据?
【发布时间】:2013-07-06 07:04:02
【问题描述】:

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

【问题讨论】:

  • WinForms .NET 4.5 岁?我以为它是在 2012 年 8 月 15 日发布的
  • 你看过devexpress.com/Support/Center/Question/Details/Q232757为什么需要很长时间?是否有很多记录或排序导致延迟?
  • 抱歉,我刚刚升级了应用程序以使用 .Net 4.5。

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


【解决方案1】:

尝试将所有数据从异步线程加载到数组中,然后使用 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 });
}

我认为这是将某些内容加载到控件中的最优化方式,因为不允许在主线程之外触摸控件。我不知道为什么微软会强制执行此操作,但他们确实这样做了。可能有一种方法可以使用反射在 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
    }
}

【讨论】:

    【解决方案2】:

    您想使用virtual mode。其他解决方案会完成所有前期工作来加载数据,然后将其放入网格中(这仍然会给您带来启动延迟),或者它们一次添加数据块(这会打乱您的滚动)。

    虚拟模式逆转了这一点;虚拟模式不是您将数据扔到网格上,而是让网格请求您的数据。

    【讨论】:

    • 是的,我认为可能有类似的东西。如果您可以更改网格视图数组指针,那就太好了。您可以异步执行此操作,然后更改指针,这几乎是即时的。也许有一种方法可以通过反射来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2021-01-03
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多