社区
C#
帖子详情
C#多线程数据混乱的疑问
Tony_Xian
2017-11-06 11:29:00
同时开三个线程,每个线程一个label控件,用这个控件读取PLC某地址上的数值,线程里面的读数据是用while(true)死循环,里面有if做判断,当读数大于某数值时,用break退出循环,但当同时开两个线程或三个线程时,偶尔会出现一种情况,读数到某一数值时,突然读数变化得很快,然后出现混乱,比如说154,变成1354,或者break无效,读数一直增加,但只开一个线程就没有这两种情况,请教一下各位大神,谢谢!
...全文
526
11
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
11 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
clark_kidd
2017-11-08
while(true) 是不是太占资源了,读一次后,sleep 100ms,再读比较好。另外,读的线程,是否可以用 lock(plcObject){read();} 来避“读数变化得很快”的问题
打赏
举报
回复
赞
正怒月神
2017-11-08
先拿一部分数据,做一下测试。 线程这方面,需要一点经验猜测。日志也是很有必要的。 不过线程主要问题集中在访问共享资源却没有Lock上。 你可以使用线程安全的集合来存放共享向资源BlockingCollection<T>
打赏
举报
回复
赞
XueDEE123
2017-11-08
你是与一台PLC通讯还是多台,说下思路过程帮你分析
打赏
举报
回复
赞
xuzuning
2017-11-06
婆婆太多,媳妇没法活 你需要精兵简政
打赏
举报
回复
赞
Tony_Xian
2017-11-06
对了,那个ui我直接用的是那个很长的,CheckForIllegalCrossThteadCalls = false
打赏
举报
回复
赞
易2017
2017-11-06
你异步更新界面UI用的invoke还是begininvoke
打赏
举报
回复
赞
CRonaldo9399
2017-11-06
引用 2 楼 boiled_water123 的回复:
对了,那个ui我直接用的是那个很长的,CheckForIllegalCrossThteadCalls = false
private void LableText(Label lable, string str) { if (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(() => LableText(lable, str))); } else { lable.Text = str; } }
打赏
举报
回复
赞
njit_77
2017-11-06
牵扯到线程问题,最好有日志记录。不然不太好分析问题,找到问题点
打赏
举报
回复
赞
xian_wwq
2017-11-06
CheckForIllegalCrossThteadCalls = false不推荐使用 线程函数内部是怎么处理的? 是否有对公用变量的操作,如果有,那么必须加锁进行同步处理 如果刷新频率秒级,没有必要一个线程一个label
打赏
举报
回复
赞
易2017
2017-11-06
引用 2 楼 boiled_water123 的回复:
对了,那个ui我直接用的是那个很长的,CheckForIllegalCrossThteadCalls = false
不推荐使用,你老老实实用invoke更新试试
打赏
举报
回复
赞
吉普赛的歌
2017-11-06
加下日志, 想办法捕获异常变动时的相关情况
打赏
举报
回复
赞
相关推荐
C#
文件上传下载(Excel导入,
多线程
下载)功能的实现代码
主要介绍了
C#
文件上传下载(Excel导入,
多线程
下载)功能的实现代码,需要的朋友可以参考下
C#
多线程
目录拷贝 文件拷贝
但是在通过程序中控制线程数量,并且通过分配线程的任务来拷贝,始终速度都没有达到理想值。问题:旧项目在存放图片附件是分别存放在DownFile 、UpFile 两个文件夹内(分为两类文件),系统运行时间一久,里面文件也...
多线程
:
C#
多线程
控制 通讯 和切换
多线程
的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括...
C#
创建线程带参数的方法
本文给大家介绍
C#
创建线程带参数的方法,包括无参数线程的创建,带一个参数线程的创建及带两个及以上参数线程的创建,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧1、无参数线程的创建Thr...
C#
多线程
操作界面控件的解决方案
C#
中利用委托实现
多线程
跨线程操作 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家...
发帖
C#
微信扫一扫
点击复制链接
分享社区
下载分享明细
10.8w+
社区成员
64.2w+
社区内容
.NET技术 C#
社区管理员
加入社区
帖子事件
创建了帖子
2017-11-06 11:29
社区公告
让您成为最强悍的C#开发者