开发者社区> 邵鸿鑫> 正文

多线程操作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;
            }));

效果图:



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

相关文章
封装多线程处理大量数据操作
们需要解决WaitAny和取得异步执行的返回值的问题。地球人都知道Thread和ThreadPool接受的委托都是没有返回值的。要想取的返回值,我们就得自己动手了,我们需要构造一个AsyncContext类,由这个类来保存异步执行的状态以并存储返回值。
639 0
UITableView取消选中颜色、常用操作
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px; font-family:verdana,'ms song',宋体,Arial,微软雅黑,Helvetica,sans-serif; line-height:18px"> 使用空白view取代cell</p> <p style="margin:10px aut
1317 0
ECS支持跨地域跨资源类型的标签(TAG)操作
ECS资源可以使用标签进行分组管理,如何快速将自己多地域/多种类型的资源都打上标签(TAG)呢?
772 0
操作系统的线程管理机制以及Thread.Sleep()的作用
说明:本文章内容来自某论坛里的一位大牛的回复。 引题:我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。
743 0
更高效地提高redis client多线程操作的并发吞吐设计
Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis本身的特性和一些client操作上的改变来提高整个redis操作的交通.
981 0
UWP开发入门(十五)——在FlipView中通过手势操作图片
原文:UWP开发入门(十五)——在FlipView中通过手势操作图片   本篇的最终目的,是模拟系统的照片APP可以左右滑动,缩放图片的操作。在实现的过程中,我们会逐步分析UWP编写UI的一些思路和技巧。
1392 0
Java多线程--线程操作范例
<h1>1、实例要求</h1> <div> <span style="white-space:pre"></span>设计一个线程操作类,要求可以产生三个线程对象,并可以分别设置三个线程的休眠时间:</div> <div> <span style="white-space:pre"></span>线程A : 休眠10秒</div> <div> <span style="white-s
901 0
+关注
邵鸿鑫
java相关技术专家
142
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载