3

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

4

2 回答 2

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 });
}

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

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

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

于 2013-07-06T15:53:42.187 回答