关于多线程对数据容器加锁导致线程阻塞

暗夜流岚 2020-03-16 10:59:07
求助多线程中接收数据用序列接收;在其他线程写出;在这个容器对象加锁;导致前面的接收线程阻塞,数据等待堆积;原因:数据接收频率非常高;求助大神怎么解决

// 数据接收
lock (obj)
{
queue1.Enqueue(new KeyValuePair<int, int>(Points[0], Points[2]));
}

//UI线程
lock (obj)
{
XYData = XYValue.ToList();
}
foreach (var keyValuePair in XYData)
{
lsitX.Add(keyValuePair.Key.ToString());
lsitY.Add(keyValuePair.Value);
}
seriesDraw.Points.DataBindXY(lsitX, lsitY);

...全文
206 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗夜流岚 2020-03-16
  • 打赏
  • 举报
回复
试过,和加锁效果区别不大

引用 3 楼 正怒月神 的回复:
你先试试看 ConcurrentQueue 这个是线程安全的queue。
暗夜流岚 2020-03-16
  • 打赏
  • 举报
回复
是原生的chart控件;
现在改过来之后确实顺畅很多单运行一会儿还是卡
 piantTick(afterPoints[0], afterPoints[2]);//接收的数据用委托来绘制
private delegate void piantChart(int x,int y);//委托

private void piantTick(int x, int y) //委托方法
{
if (chart1.InvokeRequired)
{
chart1.Invoke(p, new object[] { x, y });
}
else
{
seriesDraw.Points.AddXY(x, y);//加点
}
}




引用 1 楼 by_封爱 的回复:
先说下思路吧..我觉得你这个办法不是很好.. 因为你每次都是"重新绑定所有".

这种效率肯定不行.

最起码的 chart上面的points既然是是个集合. 肯定有Add吧?

比如(我猜的)

seriesDraw.Points.AddPoint(new Point(){x=1,y=2});


然后其实也不需要什么锁了.

在数据接收的代码中 执行这句话就OK了.

因为你现在的方式 整体绑定.. 相当于重绘了 效率肯定不行. 而且我感觉还有严重的闪烁..

如果这个控件还不支持AddPoint 那我建议你换一个控件吧..

你这个不会是mschart吧?
正怒月神 2020-03-16
  • 打赏
  • 举报
回复
你先试试看 ConcurrentQueue 这个是线程安全的queue。
github_36000833 2020-03-16
  • 打赏
  • 举报
回复
我的猜测,加锁可能不是问题所在。 问题很可能是UI处理的速度,跟不上数据加入的速度。 或许你可以放弃一部分UI更新。因为每秒刷新UI两次可能对用户来说就够了,而不用去追求UI每秒处理100次数据添加。
by_封爱 版主 2020-03-16
  • 打赏
  • 举报
回复
先说下思路吧..我觉得你这个办法不是很好.. 因为你每次都是"重新绑定所有". 这种效率肯定不行. 最起码的 chart上面的points既然是是个集合. 肯定有Add吧? 比如(我猜的)

seriesDraw.Points.AddPoint(new Point(){x=1,y=2});
然后其实也不需要什么锁了. 在数据接收的代码中 执行这句话就OK了. 因为你现在的方式 整体绑定.. 相当于重绘了 效率肯定不行. 而且我感觉还有严重的闪烁.. 如果这个控件还不支持AddPoint 那我建议你换一个控件吧.. 你这个不会是mschart吧?
暗夜流岚 2020-03-16
  • 打赏
  • 举报
回复
好的我尝试一下,谢谢大佬

引用 7 楼 by_封爱 的回复:
就目前来说 你的代码 应该是最优的了.. 跟锁 线程 异步 关系都不大.. 是控件本身的问题.

我之前做一个实时的跟你类似的项目 数据采集频率很高 运行时间很长 之前也是用mschart.

后来很多问题解决不了.就换了一套控件 用的是teechart 找的破解版..

这个控件的性能比较好. UI上画几百万个点 也不会卡..

所以 我建议你在实际项目开发之前. 先预言一下 你使用的东西 是否合适...

别到时候 都做完了 在去改 那工程非常大.
正怒月神 2020-03-16
  • 打赏
  • 举报
回复
引用 6 楼 暗夜流岚 的回复:
试过,和加锁效果区别不大
引用 3 楼 正怒月神 的回复:
你先试试看 ConcurrentQueue 这个是线程安全的queue。
那就可能不是锁的问题了。 可能是 1 控件本身的更新 2 list越来越大
by_封爱 版主 2020-03-16
  • 打赏
  • 举报
回复
就目前来说 你的代码 应该是最优的了.. 跟锁 线程 异步 关系都不大.. 是控件本身的问题. 我之前做一个实时的跟你类似的项目 数据采集频率很高 运行时间很长 之前也是用mschart. 后来很多问题解决不了.就换了一套控件 用的是teechart 找的破解版.. 这个控件的性能比较好. UI上画几百万个点 也不会卡.. 所以 我建议你在实际项目开发之前. 先预言一下 你使用的东西 是否合适... 别到时候 都做完了 在去改 那工程非常大.

110,499

社区成员

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

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

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