关于BlockingCollection的问题

zflonghui 2014-09-29 10:26:58
有两个线程,一个去读数据,另外一个把读取的数据显示出来,可是没当我点暂停然后开始的时候,程序就变得很卡,而且做出的曲线也不流畅了。哪位大神帮我看看代码,谢谢了!

创建线程
timer1.Interval = TimeSpan.FromMilliseconds(33);
timer1.Tick += new EventHandler(timer_tick1);
timer1.Start();

thread1 = new Thread(new ThreadStart(Data));
thread1.IsBackground = true;
thread1.Start();

停止按钮
if (thread1.IsAlive)
{
thread1.Abort();
}

timer1.Stop();
if (_Data == null)
{
return;
}
else
{
while (_Data.Count > 0)
{
Point item;
_Data.TryTake(out item);
}
}

创建一个队列
private readonly BlockingCollection<Point> _Data = new BlockingCollection<Point>(new ConcurrentQueue<Point>());
读取数据
for (int i = 0; i < Data1.Count(); i += 1)
{
_Data.Add(new Point(Time1[i], Data1[i]));
}
把读取的数据写入曲线
for (int i = 0; i < count; ++i)
{
Point sample = _Data.Take();
times[i] = sample.X;
values[i] = sample.Y;
}
ds0.Append(times, values);
第一个点击开始的时候,程序运行的很好,之后暂停在开始,程序开始卡了,而且曲线也不连续了。

...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zflonghui 2014-10-01
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
你应该让线程自己停止。 用一个bool变量表示是否应该取消,让线程轮询它,并且收到信号自己退出循环。
这个问题经过调试我自己解决了,我把停止按钮里的timer1.Stop给删了,也就说timer一直运行,然后就跟你说的一样,用bool变量把thread1停止,也就是说timer一直在读取信息,可是_Data为null,那timer就一直return,当我再点开始的时候,timer就不需要再开始了,因为它一直在运行,只需要再次激活thread1就好了,也就把那个bool变量变成true,总之多谢你的提示。
zflonghui 2014-09-29
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
你应该让线程自己停止。 用一个bool变量表示是否应该取消,让线程轮询它,并且收到信号自己退出循环。
那我要再次重新开始的话,还要把这个bool变量变成真,然后让while循环?
threenewbee 2014-09-29
  • 打赏
  • 举报
回复
你应该让线程自己停止。 用一个bool变量表示是否应该取消,让线程轮询它,并且收到信号自己退出循环。
zflonghui 2014-09-29
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
永远不要用thread1.Abort(); 这会导致资源泄露已经很严重的后果。
那我怎么应该把thread1停止,如果我点了停止按钮?
threenewbee 2014-09-29
  • 打赏
  • 举报
回复
永远不要用thread1.Abort(); 这会导致资源泄露已经很严重的后果。

110,533

社区成员

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

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

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