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 } }
您想使用虚拟模式 。 其他解决方案完成所有前期工作以加载数据然后将其放入网格(这仍然会给你一个启动延迟),否则他们一次添加数据块(这会弄乱你的滚动)。
虚拟模式颠倒了这一点; 而不是你在网格上抛出数据,虚拟模式将让网格请求你的数据。
- VLC媒体播放器有C#接口吗?
- 将TypeScript编译器加载到ClearScript中,“WScript未定义”,不可能完成任务?
- SerialPort编码 – 如何获得8位ASCII?
- 如果结构不能inheritance另一个类或结构,为什么Int32有一个ToString()方法?
- 如何基于HTTP头创建自定义身份validation机制?
- 使用IEnumerable 和Linq-To-Sql时如何防止内存溢出?
- 如何使用C#在.Net中的类型对象列表中选择对象属性的所有值
- 在Travis CI上使用Mono 5.14.0.177,msbuild 15.0,nuget 4.7.1构建失败,但在VirtualBox中无法重现
- 当DbDataAdapter.Update调用时,为什么我使用ODP.NET OracleDataAdapter获取OracleTruncateException而不使用System.Data.OracleClient的适配器?