多线程操作UI控件——DataGridView假死现象-阿里云开发者社区

开发者社区> 安全> 正文

多线程操作UI控件——DataGridView假死现象

简介:   在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也 给大家带来很多不便。

  在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也

给大家带来很多不便。

  今天我就遇到了一个类似的问题,对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;
            }));

效果图:



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章