多线程操作UI控件——DataGridView假死现象
2015-12-08 11:01
288 查看
在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也
给大家带来很多不便。
今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列的情况下,解决方法有两种:
第一种是通过设置
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,程序就不会再出现错误信息了,但是这种办法不能从根本是解决问题,而且本人亲测貌似只能解决了程序报错问题,在DataGridView数据能正常显示,但不能拖动滚动条,即假死现象没有得到根本解决(个人现象,有待深入考究)。
第二种就是用委托
在子线程中,把给控件赋值委托个主线程来实现。代码如下:
主线程定义委托
#region datagrideview数据绑定委托
private delegate void InvokeHandler();
#endregion
在子线程中调用 this.Invoke(new InvokeHandler(delegate()
{
this.dataGrid.DataSource = dt2;
}));
效果图:
给大家带来很多不便。
今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列的情况下,解决方法有两种:
第一种是通过设置
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,程序就不会再出现错误信息了,但是这种办法不能从根本是解决问题,而且本人亲测貌似只能解决了程序报错问题,在DataGridView数据能正常显示,但不能拖动滚动条,即假死现象没有得到根本解决(个人现象,有待深入考究)。
第二种就是用委托
在子线程中,把给控件赋值委托个主线程来实现。代码如下:
主线程定义委托
#region datagrideview数据绑定委托
private delegate void InvokeHandler();
#endregion
在子线程中调用 this.Invoke(new InvokeHandler(delegate()
{
this.dataGrid.DataSource = dt2;
}));
效果图:
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- DataGridView控件详细介绍
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例
- c#实现多线程局域网聊天系统
- PHP使用CURL实现多线程抓取网页