多线程问题。

exception92 2015-04-24 02:27:47
我通过com口不断获取数据 到List<string> 集合,并存入队列m_Queue。 然后又另开一个thread 来 处理 队列中的List<string> ,处理方式 是如下,

while(true){
if(m_Queue.Count >0){
lock(m_Queue){
bool isTrue = 判断List<string> 是否合法。
if(isTrue){
// 其它处理
}
else
{
//如果 数据异常的话,然后thread 就是WaitSleepJoin 状态,就再也收不到 com口发来的数据了。
// 大概停个10s左右,就会出现下一条数据,以后就可以接收正常了。问题就是 如果数据异常,怎么才能不会出现那个“延迟”??
}
}
}
}

下位机 每50ms 给我的com口发数据,感觉相当的频繁。 这就导致我的 m_Queue 还没有处理完,就会被下一次执行??是不是这样理解的。
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-04-24
  • 打赏
  • 举报
回复
if(m_Queue.Count >0) { } else { Thread.Sleep(1); } 避免没有任务的时候,陷入无限死循环,吃掉所有的CPU,根据数据量大小,时间可以适当延长 如果你发现一个线程无法处理那么多数据,可以根据CPU核数再开几个线程同时处理
threenewbee 2015-04-24
  • 打赏
  • 举报
回复
m_Queue.Count 这个没有锁,可能导致同步问题。 而且这个死循环如果不加上Thread.Sleep会吃掉所有的cpu
exception92 2015-04-24
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
你没处理完很正常,你这么干就是接受是接收,处理是处理,你可能接收了100条,但你才处理了20条,没有问题,把处理完的显示出来就是了
嗯,就是这个思路。
bdmh 2015-04-24
  • 打赏
  • 举报
回复
你没处理完很正常,你这么干就是接受是接收,处理是处理,你可能接收了100条,但你才处理了20条,没有问题,把处理完的显示出来就是了
百分百Libra 2015-04-24
  • 打赏
  • 举报
回复
你这里把m_Queue lock 住了 com收到数据 也加不进m_Queue 里面 其实如果你只有这个地方取数据的话 不加lock 也没事

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧