C#多线程数据混乱的疑问

Tony_Xian 2017-11-06 11:29:00
同时开三个线程,每个线程一个label控件,用这个控件读取PLC某地址上的数值,线程里面的读数据是用while(true)死循环,里面有if做判断,当读数大于某数值时,用break退出循环,但当同时开两个线程或三个线程时,偶尔会出现一种情况,读数到某一数值时,突然读数变化得很快,然后出现混乱,比如说154,变成1354,或者break无效,读数一直增加,但只开一个线程就没有这两种情况,请教一下各位大神,谢谢!
...全文
440 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#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-06 11:29
社区公告

让您成为最强悍的C#开发者