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