C#中多线程写DataGridView出现滚动条导致程序卡死(无响应)的解决办法

因为写的程序涉及到多线程维护一个DataGridView,然后蛋疼的发现经常卡死。。。一开始以为是读写冲突的原因,然后就加了锁,问题依旧。。。然后发现每次出现滚动条的时候程序才会无响应,所以感觉应该是滚动条出现问题。。。

网上说用Invoke就可以解决问题,试了一下,可能是我使用的方法不对,还是没有解决问题-_-||

最后使用InvokeRequired解决的。。。

因为我的修改DataGridView的代码是写在窗体里面的,so。。。

private static object obj = new object();

private delegate void ChangeFunction(PackageMessage pm, string Message);

public void AddWarning(PackageMessage pm, string Message)

{

   if (dgv.InvokeRequired)

   {

       ChangeFunction c = new ChangeFunction(AddWarning);

      this.Invoke(c, new object[] { pm, Message });

   }

   else

   {

      lock (obj)

      {

           DataRow dr = MessageDT.NewRow();

           dr[0] = pm.GetSendTime().ToString();

           dr[1] = pm.GetSourceIP().ToString() + ":" + pm.GetSourcePort().ToString();

           dr[2] = pm.GetDestinaionIP().ToString() + ":" + pm.GetDestinationPort().ToString();

           dr[3] = Message;

          MessageDT.Rows.Add(dr);

       }    }

}

说明一下 dgv是一个DataGridView的对象,一开始以为绑定一个DataTable dt会好些,结果发现没用。。。然后也没删-_-||

加InvokeRequired就行了,lock的那个没加貌似也没出问题,但是为了安全起见我就加上了。。。

在else里面,或者是在lock里面(如果你加锁的话)写功能代码,if的里面形式都差不多,就是参数应该不太一样吧~

时间: 2024-10-06 02:57:42

C#中多线程写DataGridView出现滚动条导致程序卡死(无响应)的解决办法的相关文章

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题.原因: 先来看Java代码: public final static void process1(String[] cmdarray) {        Process p = null;        BufferedReader br = null

SQL语句中,Conversion failed when converting datetime from character string.错误的解决办法

在项目开发过程中,我们经常要做一些以时间为条件的查询,比如查询指定时间范围内的历史记录,然而这些时间都是从UI传递过来的参数,所以我们写的sql语句就必须用到字符串拼接.当然,在C#中写SQL语句还好处理,可以使用C#的字符串函数做对应的数据类型转换.但是,如果用的是存储过程的话,就有点纠结了.下面来说一下我在写存储过程中遇到的问题: 为了更加直接的说明问题,写如下一个简单的例子: declare @dateFrom datetime; declare @dateTo datetime; dec

解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题

这个问题确实很烦人,经常导致 资源管理器无响应,关闭后整个资源管理器彻底崩溃,原因未知.本着折腾和强迫症精神,这个问题一定要解决.方法如下: 1.不要用EditPlus自带的添加到系统右键菜单选项. 2.导入下列注册表内容: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\EditPlus] @="EditPlus" "icon"="F:\\develop\\EditPlus\

QQ文件没有读取权限,60017导致QQ无法登陆的终极解决办法

每隔一段时间,我的QQ就无法登陆,提示:QQ文件没有读取权限,60017导致QQ无法登陆的终极解决办法 点击了解详情发现里面的解决办法根本不起作用,网上 说的各种解决办法都不起作用,解决办法如下 1.右键QQ图标--->2.点击兼容性--->3.勾选兼容模式的框,点击应用和确定,再次登陆,点击弹出框的是登陆,问题解决.

ios7 中代码创建 ScrollView TextView 等,默认向下缩进的解决办法

这个问题,记得以前困扰了好久.表现出来的现象就是 ScrollView 中的 ContentView 会往下移动一段距离,现在 textView 也是如此,会自动将光标下移. 后来发现这个距离差不多是 NavigationBar 的高度,才从这里找问题,最终找到了. @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES 需要设置

android - Lint Error Checking导致的无法打包问题的解决办法

Export aborted because fatal lint errors were found.These are listed in the Problems view.Either fix these before running Export again,or turn off "Run full error check when exporting app" in the Android > Lint Error checking preference page.

HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决

最近在监控中发现HiveServer2连接到zookeeper里的连接持续上涨,很奇怪,虽然知道HiveServer2支持并发连接,使用ZooKeeper来管理Hive表的读写锁,但我们的环境并不需要这些,我们已经关闭并发功能,以下是线上的配置,甚至把这些值都改成final了. 但是zookeeper连接依然会涨.后来想想,我们要访问的表是hive去映射的hbase,hiveserver2什么时候去连接zookeeper,它连接zookeeper干么,先从日志下手,将线上日志级别改为了debug

[Cordova/Phonegap] Cordova iOS 应用在第三方输入法的键盘弹出(点击输入框)时,页面不上移,导致输入框被键盘遮挡 的解决办法

http://blog.csdn.net/lovelyelfpop/article/details/52033045 Cordova iOS应用在使用系统自带输入法键盘的时候,聚焦文本框是会将整体webview界面上移的,如下图: 然而,如果你用的是第三方输入法(百度.搜狗.qq输入法等都是),聚焦文本框弹出键盘时,界面却不会整体上移,导致文本框被软键盘遮挡,如下图: 不仅被遮挡,靠底部的文本框还无法往上拖拽滚至可视区域. 解决办法一:第三方键盘弹出,实现界面也能上移 使用 ionic-plug

android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法

今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚动时自动调用 onCheckedChanged 导致的.在查看了各种博客的解决办法后,国外的网站上有一个办法解决了我的问题.写下来分享一下. 在自定义Adapter的getView方法中这样写就行了. Java代码   //在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件